|
最近在做项目时遇到了URL重写后当页面回传时,url又刷回原值;这个问题困扰了很久,终于找到解决办法了。
具体办法如下:可以通过自定义页面基类,重写默认的HtmlTextWriter方法,重写属性输出WriteAttribute(string name, string value, bool encode)方法,当输出action时,将action属性的值强制转换为当前虚URL(HttpContext.Current.Request.RawUrl,上面的~/showVisasAll_(\w+)\.aspx) 最后就是让所有的页面都调用这个基类,修改一下Web.config就好了 <!-- Openlab.Controls.OLPage为页面基类,Openlab.Controls为基类所在dll --> <pages pageBaseType="Openlab.Controls.OLPage, Openlab.Controls"/> 附页面基类完整代码(参考CS代码完成): 复制代码 代码如下: using System; using System.IO; using System.Web; using System.Web.UI; namespace Openlab.Controls ...{ /**//// <summary> /// 页面基类 /// </summary> public class OLPage : Page ...{ public OLPage() ...{ } Render#region Render /**//// <summary> /// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。 /// </summary> /// <param name="writer"></param> protected override void Render(HtmlTextWriter writer) ...{ if (writer is System.Web.UI.Html32TextWriter) ...{ writer = new FormFixerHtml32TextWriter(writer.InnerWriter); } else ...{ writer = new FormFixerHtmlTextWriter(writer.InnerWriter); } base.Render(writer); } #endregion } FormFixers#region FormFixers FormFixerHtml32TextWriter#region FormFixerHtml32TextWriter internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter ...{ private string _url; // 假的URL internal FormFixerHtml32TextWriter(TextWriter writer):base(writer) ...{ _url = HttpContext.Current.Request.RawUrl; } public override void WriteAttribute(string name, string value, bool encode) ...{ // 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL if (_url != null && string.Compare(name, "action", true) == 0) ...{ value = _url; } base.WriteAttribute(name, value, encode); } } #endregion FormFixerHtmlTextWriter#region FormFixerHtmlTextWriter internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter ...{ private string _url; internal FormFixerHtmlTextWriter(TextWriter writer):base(writer) ...{ _url = HttpContext.Current.Request.RawUrl; } public override void WriteAttribute(string name, string value, bool encode) ...{ if (_url != null && string.Compare(name, "action", true) == 0) ...{ value = _url; } base.WriteAttribute(name, value, encode); } } #endregion #endregion }
|
|