制作網站頁面的時候,有時候為了用戶的體驗和搜索引擎的收錄,很多網站經常使用偽靜態地址重寫,或者稱為URL地址重寫的辦法,來將諸如:MyEbook.aspx?ID=1,MyEbook.aspx?ID=2MyEbook.aspx?ID=3等帶有參數的動態頁面偽裝成為一個靜態頁面,比如,將以上的偽裝成為My1.html,My2.html,My3.html等等諸如此類!
出發點是很好的,不僅有利於用戶體驗,也有利於收錄,實在是一舉兩得!
好處已講,現在來談談使用這種辦法所存在的毛病,問題就在於,當你使用偽靜態技術的頁面有按鈕,需要提交內容時,這個時候,一旦與服務器之間有回發動作,那麼,地址欄裡面顯示的網頁地址就不再是偽裝出來的My1.html,My2.html,My3.html等等拉,而是變為MyEbook.aspx?ID=1,MyEbook.aspx?ID=2MyEbook.aspx?ID=3等等洛,如此一來,會讓不太懂網頁制作的網友感到不安,他們會認為自己在上一個騙子網站,認為自己提交的數據都被另外一個網站給偷走了,總之,給他們的感覺就是,這樣的網站具有欺騙性質;很可能,以後他們再也不敢上你的網站了!!!………
下面本人就個人解決如上問題的心得體會做如下說明,希望能夠幫助廣大網友解決問題!
解決如上問題,有很多種辦法,有使用Javascript禁止回發,有將頁面的
等等多種方法,反正能改的地方,都有人使用過了,並且,這樣的文章比較多,但是難以實現,就本人脾氣而已,更喜歡直接了當的辦法,盡量少改地方,免得日後出錯麻煩;
第一步:打開你的網站下面,新建一個類,文件名稱大體如此:MyActionlessform.cs
第二步:該類的代碼如下:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace MyURL
{
public class MyOLPage : Page
{
public MyOLPage()
{ }
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)
{
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);
}
}
}
之後,將這個類文件編譯成為MyActionlessform.dll文件,並在網站的項目中引用他,
第三步:打開具有回發操作的頁面,將其中的:System.Web.UI.Page更改為: MyURL.MyOLPage,如此而已,一勞永逸了,以後不再擔心回發暴露真實地址嚇走網友拉!
至此,大功可成一半多一點,接下來問題又來了,什麼問題呢,你運行一下你的網站,是不是出現如下錯誤呀!
CS0433: 類型“MyURL.MyOLPage”同時存在於“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\schoolit\3266aab1\aca2fc74\App_Code.2-69spm5.dll”和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\schoolit\3266aab1\aca2fc74\assembly\dl3\4d107fc6\00b753fe_ea19c801\MyActionlessform.DLL”中
大體就是這樣的錯誤了,針對這樣的錯誤,有很多解決辦法,有的地方說,刪除臨時使用的文件夾,刪除某個命名空間等等操作,俺都試過了,但是百試不得其果,後來俺就自己想想,出現這樣的錯誤無非就是兩個文件同時存在,但是又不能重復使用,解決辦法那還不簡單,停用一個,只使用一個就行了嘛
上面的,我們不是建立了一個MyActionlessform.cs了嗎,它存在App_Code這個文件夾裡面,另外一個是MyActionlessform.dll,兩個文件內容完全一樣,做好了,我們就不需要MyActionlessform.cs了,我們只需要MyActionlessform.dll,那麼,想方設法將前者弄走不就得了(本人建議將此文件排除項目,不提倡直接刪除該文件,因為以後可能使用到),本人做法是,在項目中直接排出MyActionlessform.cs文件,經過測試,大功至此已結束!!!!