【问题标题】:Javascript confirm message problemJavascript确认消息问题
【发布时间】:2011-02-09 19:43:37
【问题描述】:

我有一个弹出确认框,可以显示如下。

但我不知道用户点击的是确定还是取消。

                ScriptManager.RegisterStartupScript(this, this.GetType(), "ajax", "<script language='javascript'>confirm('Do u wanna change?');</script>", false);

所以我想做的就是这样。

if (orignalId != newId)
                {
 ScriptManager.RegisterStartupScript(this, this.GetType(), "ajax", "<script language='javascript'>confirm('Do u wanna change?');</script>", false);

If (user clicks Yes)
{
add some data to SQL
}
else
{
return;
}
}

我怎么知道用户点击了什么??

我试过了

  1. 我将下面的代码放在文件夹 1\jscrip.js 文件中,但我不知道如何调用它,因为我在页面中有一个使用过的 ajax 更新面板,所以我不能使用 ClientScript.RegisterClientScriptInclude 来引用它。如本链接第 6 点所述:http://www.dotnetcurry.com/ShowArticle.aspx?ID=274

Page.ClientScript.RegisterClientScriptInclude("selective", ResolveUrl(@"folder1\jscrip.js"));

function confirmation()
{
if(confirm("Are you sure?")==true)
return true;
else
return false;
}

有什么建议吗???谢谢

功能:

所以用户单击一个名为“首先保存”的按钮,然后它会检查条件“if (orignalId != newId)”,如果为真,则显示确认框,否则不显示确认框。现在如果用户点击 OK 一些值被输入到 DB 中,否则它只是返回并且什么都不做

一些额外的代码:

protected void Page_Load(object sender, EventArgs e)
        {
if (!IsPostBack)
            {
            }
 else if (Label.Text != "")
            {
                Global.logger.Debug("Postback Happ, Label = " + Label.Text);
                Button2_Click(sender, e);
            }
        }

 protected void Button2_Click(object sender, EventArgs e)
        { if (orignalCsId != 0 && newCsId != 0)
                {
                    if (orignalId != newId)
                    {
                        Global.logger.Debug("Pop Up crossed1");
                        ScriptManager.RegisterStartupScript(this, this.GetType(), "ajax", String.Format(CultureInfo.InvariantCulture, @"__doPostback('{0}', confirm('Your Data From iD1 will be populated in iD2?').toString());", Label.Text), true);
                    }
                    else if (Page.Request["__EVENTTARGET"] == Label.Text)
                    {
                        Global.logger.Debug("__EVENTARGUMENT1 = " + Page.Request["__EVENTARGUMENT"]);
                        bool userClickedOK = Boolean.Parse(Page.Request["__EVENTARGUMENT"]);
                        if (userClickedOK)
                        {
                            // Add some data to SQL.
                        }
                        else
                        {
                            return;
                        }
                        Label.Text = "";
                    }
                }
          }

【问题讨论】:

  • 所以你是在问用户他是否想要 Javascript 使用....Javascript?
  • 哦,这只是一个示例……抱歉……做出了改变……哈哈
  • 所以你想知道服务器端用户点击了客户端什么?
  • 但是开个玩笑……我真的需要这个……我已经为此工作太久了……我会感谢所有的帮助……谢谢
  • @user,谢谢,这确实更清楚:)

标签: c# javascript asp.net popup confirm


【解决方案1】:

您可以使用隐藏字段,但在用户关闭确认框后您仍需要强制回发。因为无论如何你最终都会调用__doPostBack(),所以你可以利用它的第二个参数将confirm() 的返回值发送回服务器,而无需使用隐藏字段:

if (originalId != newId) {
    ScriptManager.RegisterStartupScript(this, GetType(), "ajax",
        String.Format(CultureInfo.InvariantCulture, @"
            __doPostBack('{0}', confirm('Are you sure?').toString());
        ", yourUpdatePanel.ClientID), true);
} else if (Page.Request["__EVENTTARGET"] == yourUpdatePanel.ClientID) {
    bool userClickedOK = Boolean.Parse(Page.Request["__EVENTARGUMENT"]);
    if (userClickedOK) {
        // Add some data to SQL.
    } else {
        return;
    }
}

首先,我们比较两个 id。如果它们不同,我们需要在客户端显示一个确认框并将其结果发送回服务器,因此我们包含一个启动脚本来执行此操作(请注意,您可以将 true 作为最后一个参数传递给 @987654322 @ 以便让它为您生成&lt;script&gt; 标签)。

然后,在客户端,我们需要在对confirm() 的阻塞调用返回后调用__doPostBack() 来强制回发。 __doPostBack() 有两个参数:启动回发的控件的ClientID事件目标)和一个可选的事件参数。内部 ASP.NET 管道使用它们来引发回发事件,但这并不意味着我们不能利用它们来发挥我们的优势。

此外,如果发生回发并且 UpdatePanel 是事件目标,则上述 ASP.NET 管道将仅刷新该面板(或更多,取决于它们的 UpdateMode 属性,但这是另一个主题)。所以我们调用__doPostBack(),将UpdatePanel中的ClientID包含我们要刷新的控件,并将confirm()的返回值转换为字符串。

回到服务器端,页面重新加载,我们的代码再次运行。由于您在问题的 cmets 中暗示,如果 originalIdnewId 仍然不同,我们将不得不再次显示确认框,我认为这次它们将是相同的(else if 确保这一点)。

传递给__doPostBack() 的参数可通过__EVENTTARGET__EVENTARGUMENT 请求变量在服务器端访问。所以首先,我们检查事件目标是否是我们的UpdatePanel,如果是这样,我们知道我们正在处理强制回发并且__EVENTARGUMENT 的值是有意义的。所以我们调用Boolean.Parse()从我们之前在客户端生成的字符串反序列化它,并用它来决定是否更新数据库。

【讨论】:

  • 嗨...非常感谢您的回复..我认为您是对的,但我无法遵循一些事情,,, 1. 为什么您使用 yourupdatepanel.clientID.. 2. elseif 部分是有点令人困惑......如果你能对此有所了解,那就太好了......非常感谢
  • @user,你说得对,我会用解释更新我的答案。
  • 哇...我实际上得到了您的整个代码...现在我只是想知道如何以及使用什么来代替 yourUpdatePanel.ClientID???
  • @user,传递包含受数据库更新影响的控件的UpdatePanelClientID,因为它们应该被部分回发刷新。
  • 我可以使用 label.text 代替 yourUpdatePanel.ClientID,因为在回发时 label 的值不会改变......而且弹出窗口也没有显示......也许有一些语法错误..
【解决方案2】:

使用页面中的隐藏字段,并在用户确认或不确认后将值设置为 true 或 false。 然后@服务器端检查隐藏字段的值如果是真的继续该过程如果不使用返回或退出子。

function confirmDelete()
{

    var x = confirm("Are you sure you want to Delete?");
    if (x)
    { 
        document.getElementById('Hidden1').value = "True";
    }
    else
    {
        document.getElementById('Hidden1').value = "False";
    }
}

服务器端

if (orignalId != newId)
                {
 ScriptManager.RegisterStartupScript(this, this.GetType(), "ajax", "<script language='javascript'>confirmDelete();</script>", false);

If (Hidden1.value=="True")
{
add some data to SQL
}
else
{
return;
}

}

【讨论】:

  • 我试过这个......但问题是:我正在使用一个母版页,这是一个需要调用弹出窗口的内容页面,所以你给出的代码是一个 javascript..现在如果我把它放在 folder1\jscript.js 文件中,我该如何调用该函数。
  • 我也有 ajax 更新面板,所以使用 ClientScript.RegisterClientScriptInclude... 有一些限制...如我上面给出的链接的第 6 点所述
  • 感谢上面的代码......但是我如何调用上面的javascript函数......就像它如何知道在哪里寻找confirmDelete()函数?不过谢谢……希望我能给你更多的赞
  • 对于在你的页面内使用 updatepanel 调用 javascript 函数@服务器端使用 ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "myKey", "alert('" + TextBox1.ClientID + "') ;", true);
  • 也看了这篇,能给你一些线索dotnetcurry.com/…
【解决方案3】:

我知道这个问题已经有一段时间了,但我想插话,以防有人仍在寻找简明扼要的答案。如果您正在寻找客户端 javascript 弹出窗口来确认(是或否,是或取消等)服务器端功能,例如删除数据库项目,我发现的最简单的方法是使用 OnClientClick 参数在您的标记中的 asp:button 或 asp:linkbutton:

<asp:LinkButton Text="Delete" ID="DeleteProj" runat="server" CommandName="deleteproj" OnClientClick="return confirm('Are you sure?');" CommandArgument='<%# Eval("ProjectID") %>'/> 

单击“否”会将用户返回到您的页面,单击“是”将运行您为其设置的任何 C# 代码隐藏。这对我有用。

【讨论】:

    【解决方案4】:

    ScriptManager.RegisterStartupScript 通常会阻止弹出窗口。如果您尝试以下链接中的方法,您将在弹出窗口中完全控制每次点击。

    http://02e34b5.netsolhost.com/youtube/Zpopup.aspx

    此弹出窗口不需要任何 ajax、javascript、jquery 或 css 技巧,但可以让您完全控制。

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2012-11-03
      • 2020-02-26
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多