国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .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!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南丹县| 普兰县| 文安县| 射阳县| 宁波市| 和静县| 大安市| 太仓市| 普安县| 苏尼特右旗| 玉山县| 丰都县| 海原县| 疏勒县| 宜章县| 长岛县| 巴青县| 共和县| 新巴尔虎右旗| 天祝| 石泉县| 南汇区| 白玉县| 慈溪市| 东台市| 青铜峡市| 平江县| 江西省| 禹城市| 北碚区| 双鸭山市| 永德县| 抚松县| 高邑县| 嘉兴市| 衡东县| 潮州市| 黄冈市| 沈丘县| 乌审旗| 丰都县|