程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> ASP.NET地址重寫、使用偽靜態、頁面回發處理代碼

ASP.NET地址重寫、使用偽靜態、頁面回發處理代碼

編輯:關於C#
 

制作網站頁面的時候,有時候為了用戶的體驗和搜索引擎的收錄,很多網站經常使用偽靜態地址重寫,或者稱為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文件,經過測試,大功至此已結束!!!!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved