Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)

原文地址:http://www.cnblogs.com/frogbag/archive/2007/03/16/676768.html

Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)

我們只要在響應Sys.Application的load事件即可,它會在頁面第一次加載時,以及每次Partial Rendering之後被觸發,我們在這時候修改頁面中form元素的action屬性即可,如下:
  
  相應Sys.Application的load事件
  Sys.Application.add_load(function()
  {
   var form = Sys.WebForms.PageRequestManager.getInstance()._form;
   form._initialAction = form.action = window.location.href;
  });
  
    至於爲什麼應該這樣獲得頁面中的form元素,_initialAction又是什麼,以及爲什麼要設置它,就要牽涉到UpdatePanel的實現方式,在這裏就不多作解釋了。只要頁面中放置了這麼一小段代碼,這個問題就被解決了。
  
  
  
  深入問題:
  
    造成這個問題的原因,其實就是因爲在Url Rewrite之後,form元素的action並非客戶端請求的地址,而是Url Rewrite的目標地址。如果我們沒有使用Partial Rendering,而是使用了最傳統的PostBack,雖然不會造成頁面功能的破壞,但是在PostBack之後,用戶就會發現地址欄的內容變了,直接變成了目標地址。這可不是我們希望看到的結果,既然Rewrite了,就把它Rewrite到底。當然,我們依然可以使用上面提到的辦法,使用JavaScript來修改form元素的action,但是這個做法實在不夠“美觀大方”,而且用戶從HTML源文件中也可以看到我們Url Rewrite的目標地址,不是嗎?
  
    如果我們能夠在服務器端設置Form的action就好了,可惜System.Web.UI.HTMLControls.HTMLForm類不允許我們這麼做。不過還好,我們用的是ASP.NET,我們用的是面向對象的編程模型。於是我們“繼承”System.Web.UI.HTMLControls.HTMLForm,實現一個自己的Form控件:
  
  繼承HTMLForm類實現自己的From
  namespace ActionlessForm {
   public class Form : System.Web.UI.HTMLControls.HTMLForm
   {
   protected override void RenderAttributes(HTMLTextWriter writer)
   {
   writer.WriteAttribute("name", this.Name);
   base.Attributes.Remove("name");
   writer.WriteAttribute("method", this.Method);
   base.Attributes.Remove("method");
   this.Attributes.Render(writer);
   base.Attributes.Remove("action");
   if (base.ID != null)
   writer.WriteAttribute("id", base.ClientID);
   }
   }
  }
   
  
    然後我們就可以在頁面中使用它了。當然,在這之前,我們需要在頁面(或Web.config)裏註冊它:
  
  使用我們自己實現的Form
  <%@ Register TagPrefix="skm" Namespace="ActionlessForm"
   Assembly="ActionlessForm" %>
  ...
  <skm:Form id="Form1" method="post" runat="server">
  ...
  </skm:Form>
  
    至此,我們已經不需要在頁面裏編寫一段“巧妙”的JavaScript了,Url Rewrite之後form元素的action問題被解決了。

 

=======================================

問題描述:

一個頁面有兩次無刷新提交操作就出錯了

Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server.The status codereturnded from the server was:12031

解決:

在頁面上加了上面那段 JS 就解決問題了,呵呵~~

<script language="javascript">
Sys.Application.add_load(function()
    {
        var form = Sys.WebForms.PageRequestManager.getInstance()._form;
        form._initialAction = form.action = window.location.href;
    });

</script>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章