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>