再谈使用UrlRewrite时修改form的action属性问题

虽然我一般属于只看不写的人,但距上一篇post竟然相隔一年多,不得不感慨时间真是快得恐怖啊……

最近创业,开展了一个Web 2.0项目,之前对Ajax、Url重写技术还有所谓的XHTML+CSS+DIV只停留在理论阶段,现在有机会付诸实践了,结果在玩UrlRewrite的时候就遇到了必然会遇到的ASP.NET的HttpForm自动将真实页面地址赋给action属性的问题。

网上Google了一下,解决办法就三种,添加客户端Java脚本,重载HttpForm或者Page类

老赵这篇帖子说明了添加客户端脚本以及重载HttpForm类的方法:http://www.cnblogs.com/JeffreyZhao/archive/2006/12/27/604373.html

而马哥(我恨用辈分称呼当网名的同志……下次我改名叫干爹,嘿嘿)这篇则说明了重载Page的方法:http://www.cnblogs.com/kaima/archive/2006/12/27/604758.html

UrlRewrite本身就有隐藏服务器处理细节的作用,这一部分要交给客户端来做感觉很别扭,所以用Java脚本的方案很快就被我否决了。

重载HttpForm类也被我否决了,通过Reflector查看代码,HttpForm的RenderAtttributes方法还包含处理客户端OnSubmit事件的代码,相当多的Web控件依赖这部分功能,去掉后就会破坏框架结构。MSDN竟然教大家用这种方法,果然MSDN还是一个需要去怀疑的东西。

马哥介绍的方法比较合理,但是我认为重载Page类也是在一般情况下应该避免的行为,一个是决定哪个页用新Page类哪页不用比较麻烦,如果为了省却麻烦,那么在web.config里设置pageBaseType属性也行,但是整个网站的页面都要过一下这个类也不太符合创业用网站的细节要求。

是不是有更好的办法呢?还真的有,是我今天在研究 ASP.NET CSS Friendly Adapters 的时候醒悟的。

这个解决方案基于上面马哥的方案修改,不过前提是必须有.NET 2.0的支持。

.NET 2.0框架给ASP.NET增加了几个特殊目录,其中有一个最容易被忽视的App_Browsers目录,这里是用来存放浏览器定义文件的,相关说明可以参考MSDN:http://msdn2.microsoft.com/zh-cn/library/ms228122(VS.80).aspx

在网站根目录创建App_Browsers目录,在里面建立一个新的文件起名 RewriteForm.browser ,其内容如下:

<browsers>
   <browser refID="Default">
     <controlAdapters>
       <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
         adapterType="Kuang.HtmlFormAdapter" />
     </controlAdapters>
   </browser>
</browsers>

其中,browser节的 refID="Default" 属性是表示扩展系统原有的Default.browser文件(位于 %windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers),Default.browser 是全部浏览器定义的根,具体细节请参考MSDN说明。

Adapter的意思是适配器,在.NET领域表示在两个对象之间进行协调的对象,例如ADO.NET中众所周知的SqlDataAdapter类就是在SqlCommand和DataSet之间协调的Adapter。

ASP.NET 2.0带来了ControlAdapter的概念,意思是位于System.Web.UI.Control对象和ASP.NET之间的Adapter,同时也有PageAdapter,用于处理System.Web.UI.Page对象。

ControlAdapter并没有什么特殊的功能,只不过和重载Page类的方法相比较,前者提供了重载Web控件Render方法的能力而又不需要继承该控件,并且可以只针对特定的控件例如这里的HtmlForm类。而在马哥的方法中,如果有别的控件也用了action属性,就会被错误的改写。在 RewriteForm.browser 文件中,通过 <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="Kuang.HtmlFormAdapter" /> 这行,我指定了要重载HtmlForm类,并且提供了我自定义的ControlAdapter类的类型 Kuang.HtmlFormAdapter。

时间: 2024-10-24 10:22:40

再谈使用UrlRewrite时修改form的action属性问题的相关文章

sp.net UrlRewrite 修改form的action属性问题解决方法

搜索引擎不能支持动态页面的抓取,大量的信息就不能被潜在用户搜索到.用urlrewrite技术你可以把 http://server/news.asp教程?id=111 变成 http://server/news/111.htm 这样他们就会被搜索引擎收录了.google虽然可以抓取动态页面,但是google对动态页面的评分一般低于静态页面.所以,对大量信息发布的网站,把网站地址改变成静态的绝对是值得的 介绍的方法比较合理,但是我认为重载page类也是在一般情况下应该避免的行为,一个是决定哪个页用新

浅谈jquery采用attr修改form表单enctype不起作用的问题_jquery

做文件上传,需要将表单元素的enctype设置为'multipart/form-data',用jquery的attr方法在目前较新的主流浏览器上测试均可成功,唯独IE下死活不行.后来查阅ie浏览器6,7,8(9+由于开发机为xp,未进行测试)不支持attr的方式来修改enctype属性,需要通过dom元素的原生方法来设置, 代码如下: $('#form1').get(0).encoding = 'multipart/form-data'; 以上这篇浅谈jquery采用attr修改form表单en

ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前

原文:ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前 背景 当数据量大.查询条件复杂,多样多的时候,我们可能需要单独做一个查询界面,当用户选择设置了相关的查询条件后,点击[查询]按钮,系统就弹出一个新的页面展示出根据条件查询出的数据集. 然后,用户每点[查询]按钮就弹出一个新的页面展示出最新的查询结果. 当然,在较好的用户体验下,我认为不管用户点击了多少次[查询]按钮,系统应该只弹出并有且只有一个页面,这个页面就是展示查询结果的页面了.并且这页面还应

ASP.NET底层架构探索之再谈.NET运行时(一)

本文将重点讲解如何为特定的硬件设备自定义ASP.NET Web移动程序,以及使用模板自定义Form和Panel等控件.通过属性重写这个特性,使ASP.NET Web移动程序可以根据移动设备的硬件功能,为特定的硬件指定其控件的属性值.例如,应用程序可能需要一个Label控件在一些设备上显示较长的文本,而在另一些设备上显示较简短的文本.这就需要我们为每个控件都提供一组属性,应用程序可以针对各个设备重写这些属性.所有的ASP.NET移动控件都具有默认的外观和布局.对于ASP.NET移动控件,你可通过设

ASP.NET底层架构探索之再谈.NET运行时(二)

在这里我们有一个在ISAPI扩展中活动的,可调用的ISAPIRuntime对象的实例.每次运行时是启动的并运行着的时候(译注:相对的,如果运行时并没有启动,就需要象上一章所说的那样载入运行时),ISAPI的代码调用ISAPIRuntime.ProcessRequest()方法,这个方法是真正的进入ASP.NET管道的入口,这个流程在图4中显示. 记住ISAPI是多线程的,所以请求也会通过AppDomainFactory.Create()(译注:原文为ApplicationDomainFactor

再谈ie和firefox下的document.all属性_javascript技巧

例如下面的代码: 复制代码 代码如下: <html> <body> <SCRIPT LANGUAGE="JavaScript"> <!-- if(document.all) alert("this is a IE"); else alert("this is a Mozilla"); //--> </SCRIPT> </body> </html> 在IE浏览器会输

再谈产品体验生态 | 半兽人药剂师

产品体验,越来越重要 今天是一个体验为王的时代,这话一点都不过分.特别是对于互联网产品来说,消费者的话语权越来越强,如果你的产品做得好,不久就会口口相传:如果你的产品做得烂,不久就会骂声一片.所有这一切在过去是不可想象的.但今天,每个人都可以发布信息,每个人的声音即使弱小,也总能被别人听到.在我所工作的地方,会接触各种类型的体验问题:有产品上的体验问题,有客户服务上的体验问题,有营销活动上的体验问题.这些问题,都在一次次的降低客户心中对我们的评价.我们认为需要有一个平台,以中台形式为上层赋能:我

BGP修改NEXT_HOP下一跳属性值的几种方法

本博文将为您详细介绍BGP修改NEXT_HOP下一跳属性值的几种方法,包括通过next-hop-self变更next-hop属性,通过route-map修改BGP路由NEXT_HOP属性值等.1.通过next-hop-self可以变更next-hop属性 498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' src="http://s8.51cto.com/wyfs01/M02/44/C6/wKioOVK7h9TS_

用户交互设计:再谈人机交互中的设计隐喻

文章描述:再谈人机交互中的设计隐喻. 上篇文章<人机交互中的设计隐喻-由Mac的文件替换引出来的话题>发出来以后收到了各种各样的反馈,我索性再写一篇续文,算是集中答复吧. 用户习惯 在所有的反馈中,"用户觉得Windows的做法更好用,所以理应这样设计"的说法可谓最多.那么我们就来看一下,为什么有人会觉得Windows的做法更"好用". 我们来看两个例子. 银行里面用的系统-就是柜台后面业务人员用的那个-基本上还是字符界面,没有漂亮的图标和窗口,甚至可能