| .asax,提供Application_BeginRequest方法,在其中实现Url Rewrite,如下:
Global.asax中Application_BeginRequest方法 void Application_BeginRequest(object sender, EventArgs e) { HttpContext context = (sender as HttpApplication).Context; if (context.Request.Path.Contains("Source.aspx")) { context.RewritePath("SubFolder/Target.aspx", false); } }
这样,当我们访问~/Source.aspx文件时,则会被Rewrite至~/SubFolder/Target.aspx,打开页面,一切正常:
点击Refresh按钮之后,时间被更新了。然后当我们再点击按钮之后,错误发生了:“Sys.WebForms.PageRequestManagerServerErrorException: An unknown eror occurred while processing the request on the server. The status code returned from the server was: 12031”。
分析问题:
发生这个问题的原因是因为Url Rewrite更新了Form提交的地址,而UpdatePanel又将这地址的改变反映到了页面上。
在第一次打开页面时,我们可以看到页面的源文件中<form />元素的action已经不是我们访问的Source.aspx,而是Url Rewrite后的目标文件:
form元素的action为目标页面 ... <form name="form1" method="post" action="SubFolder/Target.aspx" id="form1"> ... </form> ...
还好我们使用了Partial Rendering,只要“目标”是正确的,UpdatePanel依旧能够正确地发送和获取数据,然后更新页面。因此,在点击Refresh按钮之后,页面被正确更新了。可是,我们form元素的action也变了,使用Web Development Helper和IE Dev Toolbar便一目了然:
由于我们在进行异步PostBack时,直接访问了~/SubFolder/Target.aspx,因此在生成的Form对象其action值为Target.aspx。于是乎,UpdatePanel兢兢业业地将客户端form元素的action也进行了修改。这样就让我们再次提交时访问了一个不存在的页面,错误就再所难免了。
解决问题:
既然发现了问题所在,那么解决起来自然也会得心应手。我们只要在响应Sys.Application的load事件即可,它会在页面第一次加载时,以及每次Partial Rendering之后被触发,我们在这时候修改页面中form元素的action属性即可,如下:
相应Sys.Application的load事件 Sys.Application.add_load(function() { var form = 上一页 [1] [2] [3] [4] 下一页 |