c# - 更新面板内的 Page.Unload 事件

标签 c# javascript asp.net user-controls updatepanel

我有一个图像按钮声明为,

<div>
    <asp:ImageButton ID="btnDoWork" runat="server" ImageUrl="/_LAYOUTS/1033/IMAGES/row.png" ValidationGroup="Page" />
</div>
<div>
    <asp:RequiredFieldValidator runat="server" ID="reqName" ControlToValidate="txtEmail" ValidationGroup="Page" ErrorMessage="enter a email" />
    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ValidationExpression="^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$" ControlToValidate="txtEmail" ValidationGroup="Page" ErrorMessage="enter a email" />
</div>

在更新面板中,

现在在代码后面我正在做这样的事情,

btnDoWork = (ImageButton)this.control.FindControl("btnDoWork"); //this code is in childcontrols method
btnDoWork.Click += new ImageClickEventHandler(btnDoWork_Click);

然后

protected void btnDoWork_Click(object sender, ImageClickEventArgs e)
        {

//Process a bit of code and at end,

this.Page.Unload += new EventHandler(Page_Unload_MessageBox);

然后在按钮点击事件中,

public static void Page_Unload_Page_Unload_MessageBox(object sender, EventArgs e)
        {
            System.Globalization.CultureInfo _culture = Thread.CurrentThread.CurrentUICulture;
            StringBuilder sb = new StringBuilder();
            sb.Append("<script language=\"javascript\">");
            sb.Append("$('body').append(\"<div id='M'><span id='text'>" +
               SPUtility.GetLocalizedString("$Resources:abc", "def", (uint)_culture.LCID) +
               "</span><br/><div id='BB' onclick='return BB();'><a href='' onclick='return BB();'>" +
               SPUtility.GetLocalizedString("$Resources:OK", "def", (uint)_culture.LCID) +
               "</a></div></div>\");");
            sb.Append("function BB() { $('#M').remove(); $('#E').remove(); return false; }");
            sb.Append("function dM(){   var browser = navigator.appName; if (browser == 'Netscape') { $('#M').css({ 'top': '5%' }, 500);    } }");
            sb.Append("</script>");

            // Write the JavaScript to the end of the response stream.
            HttpContext.Current.Response.Write(sb.ToString());

现在,如果我输入电子邮件地址,当它尝试 Response.Write 我想,我想知道还有什么选择,例如我可以在更新面板或任何其他事件中使用触发器吗?

这是我现在遇到的错误,

on Chrome and IE

注意:我更改了所有变量名称,所以如果不匹配请不要混淆

最佳答案

消息很清楚,你不能在更新面板上添加这个命令HttpContext.Current.Response.Write,因为不知道如何处理它,因为更新面板返回javascript 用于重绘页面某些部分的结构。

解决方案是在 UpdatePanel 中添加一个文字控件,在您希望添加额外 html 代码的地方,并将该控件渲染为:

txtLiteralID.Text = sb.ToString();

然而,在这里您遇到了与正常情况不同的情况,您赢得了渲染和运行脚本的机会。

主要问题是如何触发脚本运行。唯一的方法是使用标准代码的 UpdatePanel 处理程序:

<script type="text/javascript"> 
   // if you use jQuery, you can load them when dom is read.
   $(document).ready(function () {
       var prm = Sys.WebForms.PageRequestManager.getInstance();    
       prm.add_initializeRequest(InitializeRequest);
       prm.add_endRequest(EndRequest);

    });        

    function InitializeRequest(sender, args) {
    }

    function EndRequest(sender, args) {
       // after update occur on UpdatePanel run the code.
       UnloadMsgBox();
    }
</script>

现在,在 EndRequest 上,您需要调用您的脚本,它可能在您的代码中全部读取为:

function UnloadMsgBox()
{
    // render your code of the javascript.
    $('body').append(\"<div id='M'><span id='text'></span><br/><div id='BB' onclick='return BB();'><a href='' onclick='return BB();'></a></div></div>\");

    function BB() { $('#M').remove(); $('#E').remove(); return false; }"
    function dM(){   var browser = navigator.appName; if (browser == 'Netscape') { $('#M').css({ 'top': '5%' }, 500);    } }"
}

并且不需要在 UpdatePanel 上呈现它。

总结:

  • 在更新面板上,您不能使用 Response.Write 来呈现除了在他内部呈现的文字控件之外的内容。
  • 在更新面板上,您无法呈现 javascript 代码并期望运行,要运行 javascript 代码,您需要使用 UpdatePanel 附带的 EndRequest 处理程序。

关于c# - 更新面板内的 Page.Unload 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531944/

相关文章:

c# - 使用私钥签署程序集

c# - DataContract 不会反序列化 Id DataMember

javascript - 如何在函数式 Vuejs 组件中发出事件

c# - 一个下拉列表的选定索引设置页面上的所有下拉列表

asp.net - CSS 友好控制适配器导致安全错误?

c# - 如何加速 C# 中的数组克隆?

c# - 我应该如何在没有 C# 的异步的情况下实现这种在循环中异步调用的模式?

javascript - 为什么 Firefox 不接受 -moz-transition 样式?

javascript - 如何从 javascript 内部有选择地运行/加载单独的 javascript 文件?

asp.net - 在 Site.Master 中形成背景图像