2012-11-23 64 views
2

我必須聲明爲圖像按鈕內,Page.Unload事件更新面板

<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

注:我改變了所有的變量名,所以不要混淆如果有東西不匹配

回答

0

消息非常明確,您不能在更新面板上添加此命令HttpContext.Current.Response.Write,並且因爲無法知道如何處理它,因爲更新面板返回的是使用的結構由JavaScript來redra在頁面的某個部分。

的解決方案是增加的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處理程序。
+0

謝謝,但對不起有點困惑,在我的代碼中,我創建了一個與sb和所有javascript函數的文字控制,但你再次在函數UnloadMsgBox()中執行:S – Mathematics

+0

我在ChildControl方法中創建了Literal Control,然後將它添加到UpdatePanel它包含您在函數UnloadMsgBox中定義的所有代碼,但是我還有另一個可以在這裏查看的問題http://stackoverflow.com/questions/13533388/duplicate-buttons-in-update-panel-and -javascript-hack,歡呼:) – Mathematics

0

MS Ajax調用執行整頁渲染,從原始計算差異,將差異發送到客戶端,並在瀏覽器中神奇地合併差異。

如果你只是發送JavaScript作爲響應,這是框架不期望的東西,它會拋出消息。如何從UpdatePanel調用JavaScript,請參閱previous answer