1

無効なビューステートエラーに関する問題がいくつかあります。エラーが発生する理由は理解できますが、修正方法がわかりません。

これに似たページがありますが、このページ/story/?id=123とは別のページを使用しServer.Transferています。

だから私はに設定しました/infoServer.TransferRequest("/story/?id=123")、ページがそれ自体にポストバックするまでは正常に動作します。

このページには、単にページを再読み込みするログイン フォームがありますが、再/?id=123読み込みすると URL の末尾に追加されるように見えるため、最終的にこの/info/?id=123ようになり、Invalid Viewstateエラーが発生します。

私はすでに追加しようとしましたEnableViewStateMac="false"- これはエラーを修正しますが、ユーザーが期待どおりにログインしないため、必要な結果が得られません。

だから私の質問は:

  1. Server.TransferRequest素敵な URL を維持する以外に、自分のページにリダイレクトするより良い方法はありますか? Response.Redirect・避けられるならしたくない。

  2. そうでない場合、追加する必要のないこのエラーを修正する簡単な方法はありますEnableViewStateMac="false"か?

4

1 に答える 1

1

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>truetrue

メソッドを呼び出してServer.Transfer2 番目のパラメータを に設定すると、 と コレクションtrueが保持されます。フォーム フィールドの 1 つは、ページのビュー ステートを保持する非表示の __VIEWSTATE フォーム フィールドです。メッセージ認証チェックは各ページのみをチェックするため、ビュー ステート メッセージ認証チェックは失敗します。したがって、呼び出し元のページからのビュー ステートは、宛先ページでは有効ではありません。QueryStringFormServer.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 はメッセージ認証チェックを実行しません。

詳しくは

動作を再現する手順

  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 を開き、[送信] をクリックします。

于 2012-05-24T21:50:41.230 に答える