技巧/诀窍:在ASP.NET中重写URL(5)

作者:Scott Guthrie 来源:Scott Guthrie博客中文版 时间:2007-09-23 12:21:00 

在URL重写里处理ASP.NET PostBack

大家在使用ASP.NET和重写URL时经常遇到的一个疑难杂症跟处理postback场景有关。具体地来说,当你在一个网页上放置一个 <form runat="server"> 控件时,ASP.NET 会自动地默认输出标识的action属性指向当前所在页面。当使用URL重写时,会出现这样的问题,<form> 控件显示的URL不是原先请求的URL(譬如,/products/books),而是重写过后的URL(譬如,/products.aspx?category=books)。这意味着,当你做一个postback到服务器时,URL不再是你原先干净利落的那个了。

在 ASP.NET 1.0 和1.1 中,大家经常诉诸于继承<form> 控件生成他们自己的控件,来正确地输出要使用的action属性。虽然这可以工作,但结果有点乱,因为这意味着你需要更新你所有的页面来使用这个另外的表单控件,而且有时在Visual Studio所见即所得设计器里也会遇上问题。

好消息是,在ASP.NET 2.0中,有个比较干净的诀窍你可以用来重写<form>控件的action属性。具体地来说,你可利用新的ASP.NET 2.0控件适配器扩展架构来定制控件的输出,用你提供的值来覆盖action属性的值。这不要求在你的.aspx页面里做任何编码改动,而只要在你的/app_browsers文件夹里添加一个.browser文件,注册使用一个控件适配类即可输出新的action属性。


你可在这里查看一个我创建的样例实现,其展示了该如何实现与URL重写协作的表单控件适配器(Form Control Adapter) 。它在我上面使用的第一个(Request.PathInfo),第二个方法(UrlRewriter.Net 模块)中都工作,它使用Request的RawUrl属性获取原先没改写过的 URL来显示。而在第四个方法(ISAPIRewrite过滤器)中,你可以获取ISAPI过滤器保存在Request.ServerVariables["HTTP_X_REWRITE_URL"] 中的原先的URL值。

我上面的FormRewriter类实现在标准的ASP.NET和ASP.NET AJAX 1.0网页上应该都工作(如果你遇上问题的话,告诉我一声)。

正确地处理CSS和图像引用

不少人在第一次使用URL重写时,有时会遇上一个疑难杂症,就是他们发现他们的图像和CSS样式表引用有时会停止工作。这是因为他们在HTML网页里有对这些文件的相对引用,当你开始在应用里重写URL时,你需要意识到浏览器经常会在不同的逻辑层次结构层上(logical hierarchy levels)请求文件,而不是实际存储在服务器上的东西。

譬如,如果我们上面的/products.aspx网页对.aspx 网页里的logo.jpg有一个相对引用,但是通过 /products/books.aspx这个URL来请求的,那么浏览器在显示网页时,将会发出一个对/products/logo.jpg的请求,而不是对/logo.jpg的请求。要正确地引用这个文件,确认你用根目录限定了(root qualify)CSS和图像引用(“/style.css”,而不是 “style.css”)。对于ASP.NET控件,你也可以使用“~”句法从你应用的根目录来引用文件(譬如,<asp:image imageurl="~/images/logo.jpg" runat="server"/>) 。

希望本文对你有所帮助,

标签:url,重写,asp.net
0
投稿

猜你喜欢

  • asp如何编写一个DNS LOOKUP程序?

    2009-11-07 18:47:00
  • 高性能表现的网站(译)

    2008-08-31 20:26:00
  • 通过事务日志解决SQL Server常见四大故障

    2009-03-25 16:06:00
  • MYSQL中取得最后一条记录

    2010-03-09 16:08:00
  • 从MySQL4.0向MySQL5迁移数据

    2007-11-19 13:11:00
  • css可以给img元素设置背景图

    2008-09-29 15:35:00
  • ASP--IP字段截取

    2009-05-26 15:47:00
  • 妄想or未来?界面的虚拟现实化

    2010-03-01 12:53:00
  • 对“打造自己的reset.css”文中观点的不同看法

    2009-03-08 18:05:00
  • 如果用JS得到字符串中出现次数最多的字母

    2007-12-03 21:01:00
  • 谷歌历年母亲节Logo一览

    2009-05-11 12:17:00
  • ASP Google的translate API代码

    2011-04-03 11:16:00
  • YUI学习笔记(3)

    2009-01-21 16:24:00
  • 泛泛而谈界面中的斑马纹设计

    2010-07-15 12:59:00
  • PJBlog3优化——301定向跳转解决重复内容的问题

    2009-05-20 10:40:00
  • Access数据库中“所有记录中均未找到搜索关键字”的解决方法

    2011-04-14 10:31:00
  • 如何判断用户是否非正常离开聊天室?

    2010-01-18 20:30:00
  • 带你深入了解Access数据库的4种安全方式

    2008-11-28 14:34:00
  • 浅谈购物类网站如何保持视觉设计的一致性

    2009-03-30 16:02:00
  • html注释书写规范

    2008-08-13 13:06:00
  • asp之家 网络编程 m.aspxhome.com