web.config中配置:
Url Rewrite
<configSections>
<section name="RewriterConfig"
type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/test/([/w]+)/</LookFor>
<SendTo>~/test.aspx?id=$1</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<httpModules>
<system.web>
<add name="ModuleRewriter"
type="URLRewriter.ModuleRewriter, URLRewriter" />
</httpModules>
</system.web>
UrlRewrite.net
<configSections>
<section name="rewriter"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,
Intelligencia.UrlRewriter" />
</configSections>
<rewriter>
<rewrite url="^/User/(/d+)$" to="~/User.aspx?id=$1" processing="stop" />
<rewrite url="^/User/(/w+)$" to="~/User.aspx?name=$1" processing="stop" />
</rewriter>
<system.web>
<httpModules>
<add name="UrlRewriter"
type="Intelligencia.UrlRewriter.RewriterHttpModule,
Intelligencia.UrlRewriter" />
</httpModules>
</system.web>
UrlRewriter.NET在找到一个匹配的重写规则时,不会就此停止,而会继续寻找其余的匹配项,最终生效的则是能够匹配当前请求的最后一个重写规
则。如果我们需要UrlRewriter.NET在找到某个匹配项之后即生效,就需要将processing属性设为stop。
UrlRewriter.net还有很多的参数,这里可以查询。
from 提交时action路径还原方法:
在url rewriter中,我采用继承基类方法,在基类中添加类,并覆盖Render方法
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);
}
}
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);
}
}
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);
}
在asp.net2.0中也可以使用该方法 ,但我在2.0中使用以上方法时,页面调用时page_load会被执行两次。
Intelligencia:UrlRewrite.Net
在asp.net 2.0中可在 App_Browsers 文件夹添加 BrowserFile.browser 浏览器文件并添加以下代码
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="FormRewriterControlAdapter" />
</controlAdapters>
</browser>
这里利用新ASP.NET 2.0控件适配器的扩展架构来定制控件的输出,用你提供的值来覆盖action属性的值
不需要自己重写页面代码