http://support.microsoft.com/kb/316920
この記事では、問題が発生している理由を説明し、それを修正するための解決策を提供していると思います.
Response.Redirect を使用したくないことはわかっていますが、それによって問題も解決すると思います。
PRB: Server.Transfer を使用すると、"View State Is Invalid" エラー メッセージが表示される
この記事は以前 Q316920 で公開されました
廃止された KB コンテンツの免責事項
この記事は、Microsoft がサポートを提供しなくなった製品について書かれています。したがって、この記事は「現状のまま」提供され、今後更新されることはありません。
症状
を使用するHttpServerUtility.Transfer("page name", true)
と、次のエラー メッセージが表示されます。
このページのビュー ステートは無効であり、破損している可能性があります
原因
この問題は、要素のEnableViewStateMac
属性が
既定で に設定されているために発生します。この属性が true に設定されている場合、ASP.NET は、ページがクライアントからポストバックされたときに、ページのビュー ステートに対してメッセージ認証チェック (MAC) を実行します。このチェックは、ページのビュー ステートがクライアントで変更されたかどうかを判断します。セキュリティ上の理由から、この属性を に設定しておくことをお勧めします。<pages>
true
true
メソッドを呼び出してServer.Transfer
2 番目のパラメータを に設定すると、 と
コレクションtrue
が保持されます。フォーム フィールドの 1 つは、ページのビュー ステートを保持する非表示の __VIEWSTATE フォーム フィールドです。メッセージ認証チェックは各ページのみをチェックするため、ビュー ステート メッセージ認証チェックは失敗します。したがって、呼び出し元のページからのビュー ステートは、宛先ページでは有効ではありません。QueryString
Form
Server.Transfer
ビュー ステートはページ スコープであり、そのページに対してのみ有効です。ビューステートはページ間で転送されるべきではありません。
解像度
この問題を解決するには、次のいずれかの方法を使用します。
解決策 1
ページ間で値を転送して、サーバー コントロールの値を他のページに渡します。詳細については、次の MSDN ドキュメントを参照してください。 ページ間でサーバー コントロールの値を渡す
これには、宛先ページからアクセスするコントロールの各プロパティのパブリック プロパティを作成する必要があります。
多くのコントロールがあり、別のページからこれらのコントロールのプロパティにアクセスする場合は、それらのコントロールをパブリック変数として宣言することもできます。例えば:
Page1.aspx
Public Class Page1
Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
'Insert your code here.
End Class
Page2.aspx
Dim sourcePage As Page1
sourcePage = CType(Context.Handler, WebForm1)
Response.Write(sourcePage.TextBox1.Text)
解決策 2
を呼び出すときに、2 番目のパラメーター (false
デフォルト)を渡さないでくださいServer.Transfer
。例えば:
Server.Transfer("<page name>")
QueryString
このコードは、呼び出されたページにおよびForm
フィールドを送信しません。データが転送されない場合、ASP.NET はメッセージ認証チェックを実行しません。
詳しくは
動作を再現する手順
別のページに実行を転送する WebForm1.aspx という名前の .aspx ページを作成します。次のコードを WebForm1.aspx に追加します。
<%@ Page language="vb" AutoEventWireup="true" %>
<html>
<body>
<form id="WebForm1" method="post" runat="server">
<asp:TextBox id="txtName" runat="server">Your Name</asp:TextBox><br>
<asp:Button id="Button1" runat="server" Text="Submit" OnClick="Button1_Click"></asp:Button>
</form>
</body>
</html>
<script runat=server>
Sub Button1_Click(sender As Object, e As System.EventArgs)
Server.Transfer("WebForm2.aspx",true)
End Sub
</script>
WebForm2.aspx という名前の別の .aspx ページを作成し、次のコードを追加します。
<%@ Page language="vb" AutoEventWireup="true" %>
<html>
<body>
<form id="WebForm2" method="post" runat="server">
<asp:Label id="lblName" runat="server" >Web Form 2</asp:Label>
</form>
</body>
</html>
<script runat=server>
Sub Page_Load(sender As Object, e As EventArgs)
Dim thisPage As System.Web.UI.Page
Dim nameTextBox As TextBox
thisPage = CType(Context.Handler, System.Web.UI.Page)
nameTextBox = CType(thisPage.FindControl("txtName"), System.Web.UI.Control)
lblName.Text = "Your name is '" & nameTextBox.Text & "'."
End Sub
</script>
ブラウザーで WebForm1.aspx を開き、[送信] をクリックします。