使用Page.ClientScript.RegisterClientScriptBlock不起作用

时间:2011-06-30 17:22:38

标签: 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
    }
}

并点击我的按钮

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

7 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:17)

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

答案 2 :(得分:5)

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

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

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

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

  1. 用户点击提交,页面回发。
  2. 执行
  3. btnSubmit_Click,看到隐藏字段为false,并将RegisterClientScript设置为调用showMsg()。
  4. Page_LoadComplete看到隐藏字段为false,因此它什么都不做。回发完成,页面将被发送回浏览器。
  5. 浏览器解析页面,来到showMsg()并运行它。这会弹出你确定的对话框。
  6. 用户在“您确定”对话框中单击“是”。您更新的showMsg函数会检测到这一点,将隐藏字段设置为true并提交表单。页面回发。
  7. 由于表单已回发但实际上未单击提交按钮,因此此处不会调用您的btnSubmit_Click函数。
  8. Page_LoadComplete看到隐藏字段为true,因此它调用btnSubmit_Click函数。
  9. btnSubmit_Click看到隐藏字段为true,并执行实际操作。
  10. 上述方法绝对是严厉的。如果你愿意使用ajax来决定是否需要“你确定”,你可以将更多的逻辑移到客户端,并为自己节省回发操作。

    然而,无论是否严厉,上述方法都会起作用,并且只要您提出一些好的评论,就会产生相对易于维护的代码。

    原始回复:

    按照目前的说法,直到用户第二次点击“提交”按钮时才会调用showMsg():

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

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

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

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

答案 3 :(得分:1)

我理解你的问题,我建议你做以下事情。

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!!!
}

我希望这会对你有所帮助。

答案 4 :(得分:0)

FishBasketGordo感谢指出差异!非常有帮助!

Page.ClientScript.RegisterClientScriptBlock在我指出更改后才触发,即删除了标签并添加了“真正的”#39;作为第四个参数。最好不要检查没有其他脚本块反转由未触发的更改所影响的更改以及脚本块具有唯一名称。

答案 5 :(得分:-1)

今天早上我遇到了同样的问题而且只是这样:

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

在你的情况下,你可以写任何你想要的JavaScript!

答案 6 :(得分:-1)

今天早上我遇到了同样的问题而且只是这样:

Response.Write(“alert('”+ AlerteMsg +“');”);

在你的情况下,你可以写任何你想要的JavaScript!

从上面的代码..现在我需要按2次后退按钮..然后它回去.. 任何解决方案