Asp.Neturl書き換え後のページ再送アドレス変更の処理

9716 ワード

Url書き換えページでPostBackを行ってジャンプしない場合、URLがURL書き換え前の元のURLに戻るという体験はあまりよくありませんが、この場合は以下の方法で処理できます.
マイクロソフトのURLRewriterクラスライブラリに以下のクラスを追加してコンパイルし、そのUrlRewriterをプロジェクトで参照する.dllファイル
   





Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



/// <summary>

/// FormRewriter      

/// </summary>

namespace URLRewriter

{

    public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter

    {

        public FormRewriterControlAdapter()

        {

        }



        protected override void Render(HtmlTextWriter writer)

        {

            base.Render(new RewriteFormHtmlTextWriter(writer));

        }

    }



    public class RewriteFormHtmlTextWriter : HtmlTextWriter

    {

        public RewriteFormHtmlTextWriter(HtmlTextWriter writer)

            : base(writer)

        {

            base.InnerWriter = writer.InnerWriter;

        }

        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)

            : base(writer)

        {

            base.InnerWriter = writer;

        }



        public override void WriteAttribute(string name, string value, bool fEncode)

        {

            //If the attribute we are writing is the "action" attribute, and we are not on a sub-control, 

            //then replace the value to write with the raw URL of the request - which ensures that we'll

            //preserve the PathInfo value on postback scenarios

            if (name == "action")

            {

                HttpContext context = HttpContext.Current;

                if (context.Items["ActionAlreadyWritten"] == null)

                {

                    //We will use the Request.RawUrl property within ASP.NET to retrieve the origional 

                    //URL before it was re-written.

                    value = context.Request.RawUrl;

                    //Indicate that we've already rewritten the <form>'s action attribute to prevent

                    //us from rewriting a sub-control under the <form> control

                    context.Items["ActionAlreadyWritten"] = true;

                }

            }

            base.WriteAttribute(name, value, fEncode);

        }

    }



}

URLRewriterクラスライブラリコードはUrlRewriterダウンロード
そしてApp_Browsersフォルダの下にFormを作成する.browser
コードは次のとおりです.
<!--

   <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers            

-->

<browsers>

  <browser refID="Default">

    <controlAdapters>

      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"

               adapterType="URLRewriter.FormRewriterControlAdapter" />

    </controlAdapters>

  </browser>

  

    <browser id="NewBrowser" parentID="Mozilla">

        <identification>

            <userAgent match="Unique User Agent Regular Expression" />

        </identification>



        <capture>

            <userAgent match="NewBrowser (?'version'\d+\.\d+)" />

        </capture>



        <capabilities>

            <capability name="browser" value="My New Browser" />

            <capability name="version" value="${version}" />

        </capabilities>

    </browser>



    <browser refID="Mozilla">

        <capabilities>

            <capability name="xml" value="true" />

        </capabilities>

    </browser> 

</browsers>

 
htmlに書き換えた場合、本来のサイトのhtmlページは使用できなくなります
以上の方法ではこの問題は存在しません
まだできない場合はノードで追加できます

ノードの下に追加します(httpプロセッサで書き換えを実行していた場合は前に書いてください)