思归呓语

衣带渐宽终不悔,为伊消得人憔悴
随笔 - 413, 评论 - 2971, 引用 - 245

导航

关于

标签

每月存档

最新留言

广告

 

在博客园看到一文,是关于Login控件在UpdatePanel里重新定向时发生的问题的。其实,重新定向是如此基本的东西,ASP.NET AJAX怎么会不支持呢?在Reflector里,如果仔细看一下ScriptModule实现的细节,它对PreSendRequestHeaders事件做了处理

protected virtual void Init(HttpApplication context)
{
context.PreSendRequestHeaders += new EventHandler(this.PreSendRequestHeadersHandler);
context.PostAcquireRequestState += new EventHandler(this.OnPostAcquireRequestState);
context.AuthenticateRequest += new EventHandler(this.AuthenticateRequestHandler);
}

private void PreSendRequestHeadersHandler(object sender, EventArgs args)
{
HttpApplication application1 = (HttpApplication) sender;
if (PageRequestManager.IsAsyncPostBackRequest(application1.Request.Headers))
{
HttpResponse response1 = application1.Response;
if (response1.StatusCode == 0x12e)
{
string text1 = response1.RedirectLocation;
List<HttpCookie> list1 = new List<HttpCookie>(response1.Cookies.Count);
for (int num1 = 0; num1 < response1.Cookies.Count; num1++)
{
list1.Add(response1.Cookies[num1]);
}
response1.ClearContent();
response1.ClearHeaders();
for (int num2 = 0; num2 < list1.Count; num2++)
{
response1.AppendCookie(list1[num2]);
}
response1.Cache.SetCacheability(HttpCacheability.NoCache);
response1.ContentType = "text/plain"
response1.Write(PageRequestManager.EncodeString("pageRedirect", string.Empty, text1));
}
}
else if (RestHandlerFactory.IsRestRequest(application1.Context) && (application1.Response.StatusCode == 0x12e))
{
RestHandler.WriteExceptionJsonString(application1.Context, new InvalidOperationException(AtlasWeb.WebService_RedirectError));
}
}

正是处理重新定向(StatusCode=302)的,如果在web.config里设置了(这是使用 ASP.NET AJAX-Enabled Web Site 项目模板的默认设置):

<httpModules>
.....
<add name="ScriptModule" type="Microsoft.Web.UI.ScriptModule, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>

使用一个类似HttpWatch/Fiddler这样的工具,在使用UpdatePanel的情形下,针对服务器端重新定向,你会看到类似这样的输出:

23|pageRedirect||/AJAXTest2/Default.aspx|

为了确认,把上述的httpModules里的<add>注释掉的话,确实得到博客园原文里的同样错误。

所以,如果你是给现有ASP.NET项目里添加AJAX支持的话,先用ASP.NET AJAX-Enabled Web Site项目模板生成一个空项目,然后把对应的web.config里的设置拷贝到现有的web.config里,这是比较保险的做法。

打印 | 张贴于 2006-11-07 23:08:00 | Tag:AJAX/ATLAS

留言反馈

#re: 关注AJAX(6):ASP.NET AJAX是怎么实现重新定向的? 编辑
感觉Ajax框架都有走火入魔的感觉,简单问题复杂化,效率更是低下,早已违背了ajax的初衷。其实prototype.js多好,简单实用效率高,更没有这些乱七八糟的问题,想怎么做就怎么做。
现在我连Postback self都讨厌,有Postback self就有无法避免ViewState这样的性能杀手。
返古以ASP的思路做了一个项目,放弃一切会生成HTML的Server端控件,仅用Literal和Repeater,还有Usercontrol。再也不写if(!Page.IsPostBack)这样的语句,所有页面只load一次。用Ajax彻底取代ViewState。世界一下子干净了。而且做完时发现,其实这样做并不象想象的那样费时间,因为避免了乱七八糟的问题以及大大简化了页面代码从而节省了时间。
我建议如果做Internet项目的话,放弃服务端控件吧,性能差别很明显。如果是企业内部局域网的项目,且要求的开发周期很短的话,那只好将就下,用那些自动化生成的垃圾吧。
2006-11-08 10:00:00 | [匿名:sandman]
#re: 关注AJAX(6):ASP.NET AJAX是怎么实现重新定向的? 编辑
本人是从AJAX.NET BETA 1才接触,确实不知道这个问题,另外按saucer你说在JS语句检查也太过复杂了,看来还是直接采用自定义的验证跳过重定向语句比较现实.
2006-11-07 23:56:00 | [匿名:Terry Deng]
#re: 关注AJAX(6):ASP.NET AJAX是怎么实现重新定向的? 编辑
因为目前的Login控件确实是使用Response.Redirect来做客户端重新定向的,因为在你这里,重新定向是回到当前页面,所以有了全部刷新的效果。这是个缺陷,也许可以在AJAX的客户端MicrosoftAjaxWebForms.js解释编码里检查当前页面是否与定向目标页相同,相同的话,就终止重新定向
2006-11-07 23:40:00 | [匿名:saucer]
#re: 关注AJAX(6):ASP.NET AJAX是怎么实现重新定向的? 编辑
这个确实是早就支持了。还记得CTP第一版出来的时候就因为不支持这个,很多人在www.asp.net的forum里提问。scortt也写过专门的文章。

没想到现在还有人不知道
2006-11-07 23:37:00 | [匿名:出走的影子]
#re: 关注AJAX(6):ASP.NET AJAX是怎么实现重新定向的? 编辑
加了这句确实可以重定向了,多谢指教啊,web.config里确实漏了这句定义,但是问题又来了,如果用回Login控件的验证机制,验证成功之后页面会刷新一下,这样很是显违背了AJAX无刷新的原则,但改回自定义验证的话是不会刷新,看来还是重定向语句作的怪.
2006-11-07 23:29:00 | [匿名:Terry Deng]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0