此文重点在于解决URL重写时,Form的action部分出现的问题,如果你讲http://aa.com/news.aspx?id=22重写为http://aa.com/news_22.html,成功重写后,查看页面源文件,你会发现Form部分的action属性还是/news.aspx?id=22,这样不仅泄漏了真实地址,而且会发生种种问题,比如页面提交等等,现在就有了一个办法可以完美解决这个问题。(以下内容部分原创,部分代码借鉴网络)
1.首先修改web.config,以使程序找到处理Page类的模块
<system.web>
. . . . . .
<!-- News.FormAction为页面基类,News为基类所在dll -->
<pages pageBaseType="News.FormAction, News" />
. . . . . .
</system.web>
2.建立处理模块
using System;
using System.Data;
using System.IO;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace News
{
public class FormAction : Page
{
public FormAction()
{
}
#region 读取内容
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
}
#region 修改Form标记内容
#region 读取
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
#region 修改action属性
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
}