URL書き換え後、ページ再送がある場合の処理
6982 ワード
書き換えられたurlに再送が発生した場合、例えばボタンがあり、書き換えられたaspxが呼び出されると、ユーザーブラウザにaspxファイルの実際のアドレス、すなわちhttpが表示されます. //hostname/default.aspx?id=11.しかし、ユーザーの観点から見ると、 ボタンをクリックすると、突然 URL 変更は彼らを不安にさせる.だからこの問題を解決しなければならない.
解決方法は2つあります.
(1)自分でActionlessformクラスを定義し、aspxでシステムが提供するformを使用しない マーク
このクラスを作成してコンパイルした後、 ASP.NET Web アプリケーションで使用する場合は、最初に追加する必要があります. Web アプリケーション References フォルダにあります.それから 代わりに使う HtmlForm クラス、やり方は ASP.NET Webページの上部には、次の項目が追加されます.
次に、
(ある場合)を次のように置き換えます.
右の タグの置換先:
(2)以上はformを継承し、2つ目の方法はpageを継承することであり、aspxページで何も変更する必要はありません.
コード:
このファイルをdllにコンパイルし、あなたのプロジェクトで参照します.
次に、プロジェクト内のすべてのaspxファイルに対応するcsファイルの継承pageクラスのコードを継承OLPageに書き換えます.
たとえば
public class WebForm1:page
に書き換える
public class WebForm1:URL.OLPage
(3)クライアントコードによりformのactionをクリアする.
ASPXページでは、クライアントがコードを表示すると、formにactionが自動的に追加され、アドレスが最初に述べた元のページアドレスであることがわかります.ASPXページでは、actionが空の場合、現在のアドレスに返信されます.これにより,クライアントがactionをクリアする方法により,再送後もアドレスを保持し続けることができる.
ページに次のコードを追加します.
解決方法は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>