URL書き換え後、ページ再送がある場合の処理


書き換えられたurlに再送が発生した場合、例えばボタンがあり、書き換えられたaspxが呼び出されると、ユーザーブラウザにaspxファイルの実際のアドレス、すなわちhttpが表示されます. //hostname/default.aspx?id=11.しかし、ユーザーの観点から見ると、 ボタンをクリックすると、突然 URL 変更は彼らを不安にさせる.だからこの問題を解決しなければならない.
解決方法は2つあります.
(1)自分でActionlessformクラスを定義し、aspxでシステムが提供するformを使用しない マーク
 
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);

}

}

}

このクラスを作成してコンパイルした後、 ASP.NET Web アプリケーションで使用する場合は、最初に追加する必要があります. Web アプリケーション References フォルダにあります.それから 代わりに使う HtmlForm クラス、やり方は ASP.NET Webページの上部には、次の項目が追加されます.
 
<%@ Register TagPrefix="skm" Namespace="ActionlessForm"

Assembly="ActionlessForm" %>

次に、
 
<form runat="server">

(ある場合)を次のように置き換えます.
 
<skm:Form id="Form1" method="post" runat="server">

右の  タグの置換先:

(2)以上はformを継承し、2つ目の方法はpageを継承することであり、aspxページで何も変更する必要はありません.
コード:
 
using System;

using System.IO;

using System.Web;

using System.Web.UI;

namespace URL

{

public class OLPage : Page

{

public OLPage()

{ }

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);

}

}

}

このファイルをdllにコンパイルし、あなたのプロジェクトで参照します.
次に、プロジェクト内のすべてのaspxファイルに対応するcsファイルの継承pageクラスのコードを継承OLPageに書き換えます.
たとえば
public class WebForm1:page
に書き換える
public class WebForm1:URL.OLPage
(3)クライアントコードによりformのactionをクリアする.
ASPXページでは、クライアントがコードを表示すると、formにactionが自動的に追加され、アドレスが最初に述べた元のページアドレスであることがわかります.ASPXページでは、actionが空の場合、現在のアドレスに返信されます.これにより,クライアントがactionをクリアする方法により,再送後もアドレスを保持し続けることができる.
ページに次のコードを追加します.
 
<script type="text/javascript">

try{document.forms[0].action=""}catch(ex){}

</script>
html             form            Server.Transfer     , response.redirect
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
            <script type="text/javascript">
                document.forms[0].action = "";
    </script>
    </div>
    </form>