使用Page.ClientScript.RegisterClientScriptBlock不工作

本文关键字:工作 RegisterClientScriptBlock ClientScript Page 使用 | 更新日期: 2023-09-27 18:00:43

我正试图弹出一个弹出窗口,如下所示,但它不起作用。请帮助

public void btnSubmit_Click(Object o, EventArgs e)
{
    if (checkFileExists(Convert.ToString(fileInfo)))
    {
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Msg", "<script type='"text/javascript'"  language='"javascript'">function showMsg(){return confirm('"This image name already exists, do you want to replace it?'");}</script>", true);
        btnSubmit.OnClientClick = "return showMsg()";
    }
    if (something else)
    {
        // It does whatever is here but never pops the question above
    }
}

按钮上有

 <asp:Button class="Button" ID="btnSubmit" CausesValidation="True" Text="SUBMIT" runat="server"
             OnClick="btnSubmit_Click"></asp:Button>

使用Page.ClientScript.RegisterClientScriptBlock不工作

Page的另一个原因。ClientScript。RegisterClientScriptBlock不工作是指页面没有服务器端表单,例如<form id="form1" runat="server">... </form>

发送到RegisterClientScriptBlock的最后一个参数是true,它"告诉"方法将脚本包装在<script>块中,但您已经在这样做了。它可能不起作用,因为它呈现的是无效的(即嵌套的)脚本标记。

更新响应(针对OP的评论)

在ASP中实现整个"你确定吗"范式可能有点烦人。NET。这是我用来解决这个问题的一种方法。我相信还有很多其他方法可以实现这一点,其中一些更优雅。但无论如何。。。

  • 在表单中放入一个asp:Hidden字段,表示"用户确信"。将其默认值设置为false
  • 在中定义showMsg()javascript函数。ASPX文件。它总是可以出现在页面上,随时可以开火;您不希望或不需要通过RegisterClientScript有条件地添加它。如果用户确认"是的,我确信",您还需要增强该功能来做两件事:a)将asp:Hidden字段的值设置为true;b) 提交表格
  • 实现你的btnSubmit_Click()函数来检查asp:Hidden值:如果该值为true,你就知道用户已经确认了"你确定吗"对话框,所以你可以执行你的操作(隐藏值返回false以"重置"它)。如果asp:Hidden值为false,则触发RegisterClientScript调用(不是定义,而是实际调用)showMsg()函数
  • 实现Page_LoadComplete以检查隐藏值:如果为true,则以编程方式调用btnSubmitClick()

进行了上述更改后,您的页面应该表现为:

  1. 用户点击提交,页面回发
  2. btnSubmit_Click被执行,看到隐藏字段为false,并将RegisterClientScript设置为调用showMsg()
  3. Page_LoadComplete发现隐藏字段为false,因此不执行任何操作。Postback完成,页面被发送回浏览器
  4. 浏览器解析页面,进入showMsg()并运行它。这会弹出"确定"对话框
  5. 用户在"确定"对话框上单击"是"。更新后的showMsg函数检测到这一点,将隐藏字段设置为true并提交表单。Page会返回
  6. 由于表单已退回,但实际并未单击提交按钮,因此此处不会调用您的btnSubmit_Click函数
  7. Page_LoadComplete看到隐藏字段为true,因此它调用btnSubmit_Click函数
  8. btnSubmit_Click看到隐藏字段为true,并执行实际操作

上述做法绝对是高压手段。如果您愿意使用ajax来决定是否需要"确定",那么您可以将更多的这种逻辑转移到客户端,并为自己节省回发操作。

然而,无论是否严厉,只要您提出一些好的意见,上述方法都会起作用,并将导致相对容易维护的代码。

原始回复:

正如目前所写的,showMsg()直到用户第二次单击Submit按钮时才会被调用:

  1. 按钮呈现时没有OnClientClick值
  2. 用户点击提交按钮;页面向后发布
  3. 事件处理程序将"函数showMsg()"的定义放在页面上(registerClientScript);它还向按钮添加了一个OnClientClick属性。Postback完成并在浏览器上重新绘制页面
  4. 此时,showMsg()尚未被任何人调用
  5. 用户单击提交按钮
  6. 由于按钮现在有一个OnClientClick值,这次它应该调用showMsg

其他需要考虑的事项:

RegisterClientScript中有实际的javascript函数定义。为什么不简单地在页面上(在.aspx文件中)定义它呢?总是把它放在那里不会有什么坏处。直到它真正被调用,它才会被解雇。

我不熟悉您使用的双parens表示法:"GetType()"-如果它没有导致编译器错误或没有抛出,那么它可能无关紧要。

一定要熟悉Firebug和/或Fiddler,这样你就可以准确地看到渲染的HTML被发送回浏览器。它将使您的web开发调试更加容易。

我理解您的问题,建议您执行以下操作。

1-保留你的btSubmit,但在你的中

public void btnSubmit_Click(Object o, EventArgs e)
{
   if (checkFileExists(Convert.ToString(fileInfo)))
   {
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Msg", "<script type='"text/javascript'"  language='"javascript'">function showMsg(){return confirm('"This image name already exists, do you want to replace it?'");}</script>", true);
        btnSubmit.OnClientClick = "return showMsg()";
   }    
}

删除if(其他内容)。

2-使用Dialog创建一个类似于javascript确认的对话框,但有一个带有自己点击事件的asp.net按钮。

3-更改

return confirm('"This image name already exists, do you want to replace it?'"); 

在您的第一个事件的RegisterClientScriptBlock中使用jquery对话框的逻辑。

4-在你的新按钮的新事件中添加你的额外逻辑:

if (something else)
{
    // you´ll know the user click your confirm button already!!!
}

我希望这对你有帮助。

FishBasketGordo感谢您指出差异!帮了我很大的忙!

Page.ClientScript.RegisterClientScriptBlock直到我进行了您指出的更改(即删除了标记并添加了"true"作为第四个参数)才启动。检查是否有其他脚本块可以反转未启动的脚本块所影响的更改,以及脚本块是否具有唯一的名称,这可能是一个好主意。

今天早上我遇到了同样的问题,它只起作用:

Response.Write("<script type='text/javascript'>alert('" + AlerteMsg + "');</script>");

在您的情况下,您可以编写任何您想要的javascript!

今天早上我遇到了同样的问题,它只起作用:

Response.Write("alert('"+AlerteMsg+"');");

在您的情况下,您可以编写任何您想要的javascript!

来自上面的代码。。现在我需要按两次后退按钮。。然后它又回来了。。任何解决方案