首页 > 编程 > .NET > 正文

ASP.NET 中执行 URL 重写

2024-07-10 13:11:28
字体:
来源:转载
供稿:网友
  url 重写就是把url地址重新改写
  
  详情:http://www.microsoft.com/china/msdn/library/webservices/asp.net/urlrewriting.mspx
  
  优点:把url缩短等
  
  用法:1.下载ms的urlrewrite.dll,放到你的bin下
  
  2.在web.config里设置如下:
  
  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
  
  <configsections>
  
  <section name="rewriterconfig" type="urlrewriter.config.rewriterconfigserializersectionhandler, urlrewriter" />
  
  </configsections>
  
  
  <rewriterconfig>
  
  <rules>
  
  <rewriterrule>
  <lookfor>~/d(/d+)/.aspx</lookfor>
  <sendto>~/default.aspx?id=$1</sendto>
  </rewriterrule>
  
  </rules>
  
  </rewriterconfig>
  
  <system.web>
  
  
  <httphandlers>
  
  <add verb="*" path="*.aspx"
  
  type="urlrewriter.rewriterfactoryhandler, urlrewriter" />
  
  </httphandlers>
  
  
  
  然后在cs里写:
  
  private void page_load(object sender, system.eventargs e)
  {
  // 在此处放置用户代码以初始化页面
  response.write(request.querystring["id"]+"<br>");
  response.write("haha");
  }
  
  只要输入
  
  localhost/overred/d123.aspx(注意:开头必须为d,后为数字)
  其实这个d123.aspx是虚拟的,并不是实际存在的。只要符合格式就行。
  
  他就会跳到http://localhost/overred/default.aspx
  
  而且他在default里可以捕捉一些参数比如id,就是你的d后的数字(后必须为数字),这样你就可以显示id为123的文章。
  
  在重写后的url里如果产生回发将会传递到d123.aspx,这样用户在点button时会看到哪个实际的地址,msdn上说的:但从用户的角度考虑,如果单击按钮时突然看到 url 更改会使他们感到不安。
  
  可见ms把客户捧为他的上帝!(真的?#¥%……—*)
  
  继续引用ms:
  
  出现这种情况的原因是:在呈现 web 窗体时,它会将其操作属性直接设置为 request 对象中文件路径的值。当然,在呈现 web 窗体时,url 已从 /products/beverages.aspx 重写为 listproductsbycategory.aspx?categoryid=1,这表明 request 对象报告用户要访问 listproductsbycategory.aspx?categoryid=1。只需使服务器端窗体不呈现操作属性即可解决此问题。(默认情况下,如果窗体不包含操作属性,浏览器将会回发。)
  
  不幸的是,web 窗体不允许您明确指定操作属性,也不允许您设置某些属性以禁用操作属性的呈现。因此,我们必须自己来扩展 system.web.htmlcontrols.htmlform 类,覆盖 renderattribute() 方法并明确指出它不会呈现操作属性。
  
  由于继承功能,我们可以获得 htmlform 类的所有功能,并且只需添加几行代码即可获得所需的行为。以下显示了自定义类的完整代码:
  
  namespace actionlessform {
  public class form : system.web.ui.htmlcontrols.htmlform
  {
  protected override void renderattributes(htmltextwriter writer)
  {
  writer.writeattribute("name", this.name);
  base.attributes.remove("name");
  
  writer.writeattribute("method", this.method);
  base.attributes.remove("method");
  
  this.attributes.render(writer);
  
  base.attributes.remove("action");
  
  if (base.id != null)
  writer.writeattribute("id", base.clientid);
  }
  }
  }
  
  已被覆盖的 renderattributes() 方法的代码仅包含 htmlform 类的 renderattributes() 方法的准确代码,而不设置操作属性。(我使用 lutz roeder 的 reflector 来查看 htmlform 类的源代码。)
  
  创建此类并对其进行编译之后,要在 asp.net web 应用程序中使用它,应首先将其添加到 web 应用程序的 references 文件夹中。然后,要使用它来代替 htmlform 类,只需在 asp.net 网页的顶部添加以下内容即可:
  
  <%@ register tagprefix="skm" namespace="actionlessform"
  assembly="actionlessform" %>
  
  然后,将 <form runat="server">(如果有)替换为:
  
  <skm:form id="form1" method="post" runat="server">
  
  并将右边的 </form> 标记替换为:
  
  </skm:form>
  
  以上的是继承个form,其实还有更简单的,就是继承page,这样你不需要在aspx页中改任何东西。
  代码:
  using system;
  using system.io;
  using system.web;
  using system.web.ui;
  
  namespace url
  {
  /**//// <summary>
  /// 页面基类www.knowsky.com
  /// </summary>
  public class olpage : page
  {
  public olpage()
  {
  } 
      
  /**//// <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);
  } 
   
  } 
   
  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);
  }
  }
  
  }
  
  
  你把他封装成dll,以后只要添加引用就可以拉! 
   
  ok ,it is so easy!
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表