首页 > 解决方案 > ASP.NET 条件是/否消息框

问题描述

我有一个 asp:Button 在 OnClick 事件上触发代码隐藏函数。在那个 OnClick 事件中发生了几件事,其中我检查了数据库是否需要询问用户是或否的问题。为此,我需要一个消息框。首先我这样做:

protected void MyButton_Onclick(object sender, EventArgs e)
{
    // lots of stuff happening
    bool iNeedToAskTheUser = INeedToAskTheUser(stuff);
    if (iNeedToAskTheUser) 
    {
        DialogResult result = MessageBox.Show("Do you want to fix all objects?", "Fix objects", MessageBoxButtons.YesNo);
        if (result == DialogResult.Yes) // do stuff
    }
    // some other stuff
}

这在本地工作正常,但在部署时不能,所以我想我需要使用 ScriptManager.RegisterStartupScript 代替。我可以在 ASPX 页面上添加 javascript 来启动一个对话框并将响应保存在一个隐藏控件中,然后我可以查看它,但是我不想启动对话框,除非我必须这样做,我之前检查过我在上面的代码中执行 DialogResult。因此,当用户单击按钮时,我无法立即执行此操作。

有什么办法可以在我的 _OnClick 代码的“中间”使用 ScriptManager.RegisterStartupScript 以便我可以选择是否实际显示按钮,然后还知道用户是否单击是或否,(最好)不做回传?

标签: asp.netwebcode-behind

解决方案


我一直在思考和测试两种不同的解决方案:

  1. 在后面的代码中使用 ScriptManager.RegisterStartupScript 在 ASPX 页面上触发 JavaScript 确认函数。JavaScript 函数将根据用户是否回答是或否在隐藏控件中设置一个值,然后我的代码背后的东西将检查该隐藏字段的值并据此采取行动。问题在于一旦 ScriptManager.RegisterStartupScript 触发,它不会等待 JavaScript 函数“完成”,即等待用户回复 Confirm()。因此隐藏控件中的值将始终为空,因为在用户有机会响应 confirm() 之前,后面的代码会检查该控件。所以这是不行的。
  2. 在后面的代码中使用 ScriptManager.RegisterStartupScript 打开一个新的 ASPX 页面,该页面询问用户问题,然后在该页面中响应用户的回答执行所有工作。那么问题是传递新的 ASPX 页面需要处理的对象以响应用户的响应。

我确信使用 Ajax 或 jQuery 有很好的解决方案,但这是一个相当简单的功能,不应该花费太长时间来开发,所以这超出了这个范围。

相反,我将采用一种解决方案,在该解决方案中,我知道用户在单击按钮之前会回答什么问题。(虽然我低声喃喃自语:“现在是 2019 年,没有好的方法可以从 .Net Web 项目后面的代码中启动一个是/否对话框......”。我需要回到不使用 Web 的状态)。


推荐阅读