使用Page.ClientScript.RegisterClientScriptBlock不起作用

use*_*502 17 c# asp.net

我试图点击弹出如下所示,但它不起作用.请帮忙

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的按钮上

 <asp:Button class="Button" ID="btnSubmit" CausesValidation="True" Text="SUBMIT" runat="server"
             OnClick="btnSubmit_Click"></asp:Button>
Run Code Online (Sandbox Code Playgroud)

use*_*954 36

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


Fis*_*rdo 17

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


mik*_*nne 5

更新后的回应(回应OP的评论)

整个"你确定"的范例在ASP.NET中实现会有点烦人.这是我用来解决它的方法.我相信还有很多其他方法可以实现这一目标,其中一些更优雅.但无论如何...

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

完成上述更改后,您的页面应如下所示:

  1. 用户点击提交,页面回发.
  2. 执行btnSubmit_Click,看到隐藏字段为false,并将RegisterClientScript设置为调用showMsg().
  3. Page_LoadComplete看到隐藏字段为false,因此它什么都不做.回发完成,页面将发送回浏览器.
  4. 浏览器解析页面,来showMsg()并运行它.这会弹出你确定的对话框.
  5. 用户在"您确定"对话框中单击"是".您更新的showMsg函数会检测到这一点,将隐藏字段设置为true并提交表单.页面回发.
  6. 因为表单已回发但实际上没有单击提交按钮,所以此处不会调用您的btnSubmit_Click函数.
  7. Page_LoadComplete看到隐藏字段为true,因此它调用btnSubmit_Click函数.
  8. btnSubmit_Click看到隐藏字段为true,并执行实际操作.

上述方法绝对是严厉的.如果你愿意使用ajax来决定是否需要"你确定",你可以将更多的逻辑移到客户端,并为自己节省回发操作.

但是,无论是否严厉,上述方法都可行,并且只要您提出一些好的评论,就会产生相对易于维护的代码.

原始回应:

按照目前的编写,直到用户第二次单击"提交"按钮时才会调用showMsg():

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

其他需要考虑的事项:

您在RegisterClientScript中有实际的javascript函数定义.为什么不简单地在页面上定义它(在.aspx文件中)?总是把它放在那里不会有任何伤害.直到实际调用它才会被触发.

我不熟悉你正在使用的doubled-parens表示法:"GetType()()" - 如果它没有引起编译器错误或没有抛出,它可能是无关紧要的.

绝对熟悉Firebug和/或Fiddler,因此您可以准确地看到呈现的HTML被发送回浏览器的内容.它将使您的Web开发调试变得更加容易.