URL 重写就是把URL地址重新改写(汗^_^)。
详情:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
优点:把url缩短等
用法:1.下载ms的UR***write.dll,放到你的bin下
2.在we***onfig里设置如下:
<sy***m.web>
type="UR***writer.RewriterFactoryHandler, URLRewriter" /> 然后在cs里写: private void Page_Load(object sender, Sy***m.EventArgs e) 只要输入 lo***host/overred/d1***aspx(注意:开头必须为d,后为数字) 他就会跳到http://localhost/overred/default.aspx 而且他在default里可以捕捉一些参数比如id,就是你的d后的数字(后必须为数字),这样你就可以显示id为123的文章。 在重写后的url里如果产生回发将会传递到d1***aspx,这样用户在点button时会看到哪个实际的地址,msdn上说的:但从用户的角度考虑,如果单击按钮时突然看到 URL 更改会使他们感到不安。 可见ms把客户捧为他的上帝!(真的?#¥%……—*) 继续引用ms: 出现这种情况的原因是:在呈现 Web 窗体时,它会将其操作属性直接设置为 Request 对象中文件路径的值。当然,在呈现 Web 窗体时,URL 已从 /P***ucts/Beverages.aspx 重写为 Li***roductsByCategory.aspx?CategoryID=1,这表明 Request 对象报告用户要访问 Li***roductsByCategory.aspx?CategoryID=1。只需使服务器端窗体不呈现操作属性即可解决此问题。(默认情况下,如果窗体不包含操作属性,浏览器将会回发。) 不幸的是,Web 窗体不允许您明确指定操作属性,也不允许您设置某些属性以禁用操作属性的呈现。因此,我们必须自己来扩展 Sy***m.Web.HtmlControls.HtmlForm 类,覆盖 RenderAttribute() 方法并明确指出它不会呈现操作属性。 由于继承功能,我们可以获得 HtmlForm 类的所有功能,并且只需添加几行代码即可获得所需的行为。以下显示了自定义类的完整代码: namespace ActionlessForm { wr***r.WriteAttribute("method", th***Method); th***Attributes.Render(writer); ba***Attributes.Remove("action"); if (base.ID != null) 已被覆盖的 RenderAttributes() 方法的代码仅包含 HtmlForm 类的 RenderAttributes() 方法的准确代码,而不设置操作属性。(我使用 Lutz Roeder 的 Reflector 来查看 HtmlForm 类的源代码。) 创建此类并对其进行编译之后,要在 ASP.NET Web 应用程序中使用它,应首先将其添加到 Web 应用程序的 References 文件夹中。然后,要使用它来代替 HtmlForm 类,只需在 ASP.NET 网页的顶部添加以下内容即可: <%@ Register TagPrefix="skm" Namespace="ActionlessForm" 然后,将
{
// 在此处放置用户代码以初始化页面
Re***nse.Write(Re***st.QueryString["id"]+"
");
Re***nse.Write("haha");
}
其实这个d1***aspx是虚拟的,并不是实际存在的。只要符合格式就行。
public class Form : Sy***m.Web.UI.HtmlControls.HtmlForm
{
protected override void RenderAttributes(HtmlTextWriter writer)
{
wr***r.WriteAttribute("name", th***Name);
ba***Attributes.Remove("name");
ba***Attributes.Remove("method");
wr***r.WriteAttribute("id", ba***ClientID);
}
}
}
Assembly="ActionlessForm" %>
并将右边的 标记替换为:
以上的是继承个form,其实还有更简单的,就是继承page,这样你不需要在aspx页中改任何东西。
代码:
using System;
using Sy***m.IO;
using Sy***m.Web;
using Sy***m.Web.UI;
namespace URl
{
/**////
/// 页面基类www.downcodes.com
///
public class OLPage : Page
{
public OLPage()
{
}
/**////
/// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
///
///
protected override void Render(HtmlTextWriter writer)
{
if (writer is Sy***m.Web.UI.Html32TextWriter)
{
writer = new FormFixerHtml32TextWriter(wr***r.InnerWriter);
}
else
{
writer = new FormFixerHtmlTextWriter(wr***r.InnerWriter);
}
ba***Render(writer);
}
}
internal class FormFixerHtml32TextWriter : Sy***m.Web.UI.Html32TextWriter
{
private string _url; // 假的URL
internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
{
_url = Ht***ontext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
// 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
if (_url != null && st***g.Compare(name, "action", true) == 0)
{
value = _url;
}
ba***WriteAttribute(name, value, encode);
}
}
internal class FormFixerHtmlTextWriter : Sy***m.Web.UI.HtmlTextWriter
{
private string _url;
internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
{
_url = Ht***ontext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && st***g.Compare(name, "action", true) == 0)
{
value = _url;
}
ba***WriteAttribute(name, value, encode);
}
}
}
你把他封装成dll,以后只要添加引用就可以拉!
ok ,it is so easy!
下一篇: .net延迟加载的一般实现