昨天寫了個URL重寫,因為在重寫後的URL裡有一個小小的Bug的,就是在Post資料時會把原URL裡的地址變成GET。
比如原地址URL為:http://localhost/Test/Default.aspx
重寫後的URL:http://localhost/Test/2004/12/News.aspx
而在Default.aspx檔案裡有Post資料(如Post文本)。那麼這時重寫後的URL就會變為:http://localhost/Test/2004/12/News.aspx?ID=12
顯然,這不是我們想要的URL也不是標準的。
其實,有細讀過在MS上的MSDN裡的這篇文章的朋友都知道,裡面已經有講述了且問題也已經解決了的。
http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
可能上面連結的文檔相對較長,有朋友讀完到URL重寫後就沒再往下看了。在文章下頭裡有細說明,怎麼個把Form的Action清除掉。這裡我所插一句的是:在ASP.net的頁面WebForm裡,一個頁面只能有一個Form,但同時,這個Form的Action是不可變的(即只能Post資料回本頁面)。如需要變動,則要自己寫一個Form控制項,此控制項繼承System.Web.UI.HtmlControls.HtmlForm介面。
這裡是URLRewriter的源碼下載:
http://upserver2.ys168.com/ys168up/D1/ys1.aspx?f=MSDNURLRewriting.msiy71z73f8b3f8b4b0f8z95b6b1f9b5f9f5f9b1f8b0b2b1f6e09e15e05e24b1b0f2b0f9f9b1f6b7f8b1z
在這個源碼中,找到URLRewriter.dll和ActionlessForm.dll這兩個DLL檔案。其實一整個源碼就只有這兩個檔案有用的。
第一個不用多說了,前文已經說了怎麼用這個DLL。對於ActionlessForm.dll這個就是一個控制項,用法也很簡單:
首先把ActionlessForm.dll拷入你的項目中的bin目錄,然後在你的VS.net的項目中引用這個dll。再在你原有的(即沒重寫的).aspx頁面中
第一步:把這句加於代碼頂部:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
第二步:
<form id="Form1" method="post" runat="server">和</form>
替換成:
<skm:Form id="Form1" method="post" runat="server">和</skm:Form>
OK,現在你可以再運行程式試試了。
----------
附:為什麼URL就會變為:http://localhost/Test/2004/12/News.aspx?ID=12
其實很簡單,因為在web.config中有這樣的一句:
<SendTo>~/Default.aspx?ID=$2</SendTo>
在沒有替換form之前,你查看頁面的源碼就可以看到,你的form的Action是到(以上面的例子):Default.aspx?ID=12
即.aspx頁面最後產生的HTML是:
<form id="Form1" name="Form1" method="post" action="Default.aspx?ID=12"></form>
還有,如果想用URL重寫後的格式為以目錄形式即不用加Default.aspx:
http://localhost/Test/2004/12
則要建立相應的目錄和檔案Default.aspx。
如上例子:http://localhost/Test/2004/12
則要建立2004目錄和在此目錄下建立12目錄,再在12目錄下建立Default.aspx檔案。檔案內容可為空白。
至於為什麼,是因為IIS如沒有找到目錄或檔案時會報錯。
http://community.csdn.net/Expert/TopicView1.asp?id=4218777
--------------
附:URL重寫
http://www.cnblogs.com/HD/archive/2005/06/20/177633.html
http://www.cnblogs.com/HD/archive/2005/06/21/178367.html