Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Page.ClientScript.RegisterClientScriptBlock无法工作_C#_Asp.net - Fatal编程技术网

C# 使用Page.ClientScript.RegisterClientScriptBlock无法工作

C# 使用Page.ClientScript.RegisterClientScriptBlock无法工作,c#,asp.net,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

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

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
    }
}
public void btnSubmit\u单击(对象o,事件参数e)
{
if(checkFileExists(Convert.ToString(fileInfo)))
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),“Msg”,“function showMsg(){return confirm(\“此映像名称已存在,是否替换它?\”;}),true);
btnSubmit.OnClientClick=“return showMsg()”;
}
如果(其他事情)
{
//它在这里做任何事情,但从来没有弹出上面的问题
}
}
在我的按钮上

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


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

更新了响应(响应OP的评论)

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

  • 在表单中放置一个asp:Hidden字段,以表示“用户确信”。将其默认值设置为false
  • 直接在.ASPX文件中定义showMsg()javascript函数。它可以永远在页面上,随时准备开火;您不希望或不需要通过RegisterClient脚本有条件地添加它。如果用户确认“是,我确定”,您还需要增强该功能以执行两件事:a)将asp:Hidden字段的值设置为true;b) 提交表格
  • 实现btnSubmit_Click()函数以检查asp:Hidden值:如果该值为true,则您知道用户已确认“确定”对话框,因此您可以执行操作(将隐藏值返回false以“重置”它)。如果asp:Hidden值为false,则触发RegisterClient脚本调用(不是定义,而是实际调用)showMsg()函数
  • 实现Page_LoadComplete以检查隐藏值:如果为true,则以编程方式调用btnSubmitClick()
在进行上述更改后,您的页面的行为应如下所示:

  • 用户单击提交,页面发回
  • btnSubmit_Click被执行,发现隐藏字段为false,并将RegisterClient脚本设置为调用showMsg()
  • Page_LoadComplete看到隐藏字段为false,因此它不做任何操作。回发完成,页面被发送回浏览器
  • 浏览器解析页面,来到showMsg()并运行它。这会弹出“是否确定”对话框
  • 用户单击“确定”对话框上的“是”。更新后的showMsg函数检测到这一点,将隐藏字段设置为true并提交表单。页面发回
  • 由于表单已发回,但未实际单击“提交”按钮,因此此处未调用btnSubmit_Click函数
  • Page_LoadComplete看到隐藏字段为true,因此它调用btnSubmit_Click函数
  • btnSubmit\u单击会看到隐藏字段为true,并执行实际操作
  • 上述方法无疑是严厉的。如果您愿意使用ajax来决定是否需要“确定”,那么您可以将更多的逻辑转移到客户端,并节省回发操作

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

    原始响应:

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

  • 按钮渲染时没有OnClientClick值
  • 用户点击提交按钮;页面发回
  • 事件处理程序将“函数showMsg()”的定义放在页面上(registerClientScript);它还向按钮添加OnClientClick属性。回发完成,页面在浏览器上重新绘制
  • 此时,showMsg()尚未被任何人调用。
  • 用户单击提交按钮
  • 由于按钮现在有一个OnClientClick值,这次它应该调用showMsg
  • 其他需要考虑的事项:

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

    我不熟悉您正在使用的双帕伦斯表示法:“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()";
       }    
    }
    
    在第一个事件的RegisterClientScriptBlock中,使用jquery对话框的逻辑

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

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

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

    鱼篮子戈多谢谢你指出其中的区别!真是帮了大忙


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

    Page.ClientScript.RegisterClientScriptBlock不工作的另一个原因是页面没有服务器端表单,例如

    今天早上我也遇到了同样的问题,它只是这样工作的:

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