[PRB] Server.Transfer を使用するとエラー メッセージ "ViewState は無効です" が表示される

文書翻訳 文書翻訳
文書番号: 316920 - 対象製品
この記事は、以前は次の ID で公開されていました: JP316920
すべて展開する | すべて折りたたむ

目次

現象

HttpServerUtility.Transfer("page name", true) を使用すると、以下のエラー メッセージが表示されます。
このページの ViewState は無効です。壊れている可能性があります。

原因

この問題は、<pages> 要素の EnableViewStateMac 属性がデフォルトで true に設定されているために発生します。この属性が true に設定されている場合、クライアントからページが返送されると、ASP.NET がそのページのビュー ステートに対してメッセージ認証チェック (MAC) を実行します。このチェックでは、ページのビュー ステートがクライアント上で修正されたかどうかが確認されます。セキュリティ上の理由から、この属性は true に設定しておくことをお勧めします。

Server.Transfer メソッドを呼び出して 2 番目のパラメータを true に設定すると、QueryString コレクションおよび Form コレクションが保持されます。フォーム フィールドの 1 つが非表示の __VIEWSTATE フォーム フィールドになり、そのページのビュー ステートを保持します。メッセージ認証チェックでは各ページがチェックされるだけであるため、ビュー ステートのメッセージ認証チェックは失敗します。このため、Server.Transfer を呼び出すページのビュー ステートが転送先のページで無効になります。

ビュー ステートはページ限定で、そのページに対してのみ有効です。ビュー ステートをページ間で転送しないでください。

解決方法

この問題を解決するには、次のいずれかの方法を使用します。

解決策 1

ページ間で値を転送し、サーバー コントロール値を他のページに渡します。詳細については、以下の MSDN ドキュメントを参照してください。
ページ間でサーバー コントロール値を渡す
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconpassingservercontrolvaluesbetweenpages.asp
この場合、転送先ページからアクセスするコントロールの各プロパティに対してパブリック プロパティを作成する必要があります。

コントロールが多数あり、コントロールのプロパティに別のページからアクセスする場合は、コントロールをパブリック変数として宣言することもできます。以下に例を示します。

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

Server.Transfer を呼び出す場合は、2 番目のパラメータ (デフォルトでは false) を渡さないようにします。以下に例を示します。
Server.Transfer("<page name>")
				
上記のコードでは、呼び出されるページに QueryString フィールドおよび Form フィールドを送信しません。データが転送されないので、ASP.NET はメッセージ認証チェックを実行しません。

詳細

問題の再現手順

  1. 別のページに実行を転送する 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>
    					
  2. 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>
    					
  3. ブラウザで WebForm1.aspx を開き、[Submit] をクリックします。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 316920 (最終更新日 2004-01-20) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 316920 - 最終更新日: 2004年6月23日 - リビジョン: 3.1
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.0
キーワード:?
kbprb kbstate kbwebforms KB316920
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com