ASP.NET中執行URL重寫

來源:互聯網
上載者:User
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 Form時,它會將其操作屬性直接設定為 Request 對象中檔案路徑的值。當然,在呈現 Web Form時,URL 已從 /Products/Beverages.aspx 重寫為 ListProductsByCategory.aspx?CategoryID=1,這表明 Request 對象報告使用者要訪問 ListProductsByCategory.aspx?CategoryID=1。只需使伺服器端表單不呈現操作屬性即可解決此問題。(預設情況下,如果表單不包含操作屬性,瀏覽器將會回傳。)

不幸的是,Web Form不允許您明確指定操作屬性,也不允許您設定某些屬性以禁用操作屬性的呈現。因此,我們必須自己來擴充 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,以後只要添加引用就可以拉!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.