PRB: "View State ist ungültig" Fehlermeldung, wenn Sie Server.Transfer verwenden

Veralteter Haftungsausschluss für KB-Inhalte

Dieser Artikel wurde für Produkte geschrieben, für die Microsoft keinen Support mehr anbietet. Deshalb wird dieser Artikel im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.

Problembeschreibung

Bei Verwendung von HttpServerUtility.Transfer ("Namen", true) wird die folgende Fehlermeldung angezeigt:
Die für diese Seite ist ungültig und möglicherweise beschädigt

Ursache

Dieses Problem tritt auf, weil das EnableViewStateMac -Attribut des < Pages > -Elements standardmäßig auf true festgelegt ist. Wenn dieses Attribut auf truefestgelegt ist, führt ASP.NET eine Message Authentication (MAC) für den Anzeigezustand der Seite, wenn die Seite vom Client zurückgesendet wird. Diese Überprüfung bestimmt, ob der Ansichtszustand der Seite auf dem Client geändert wurde. Aus Sicherheitsgründen wird empfohlen, dieses Attributverwenden.

Beim Aufrufen der Methode Server.Transfer und den zweiten Parameter auf truefestgelegt, behalten Sie die Abfragezeichenfolge und die Form . Eines der Felder des Formulars wird der ausgeblendete __VIEWSTATE-Formularfeld, das den Ansichtszustand für die Seite enthält. Der Status Message Authentication überprüfen schlägt fehl, da die Nachricht Authentifizierung nur jeder Seite überprüft. Daher ist der Ansichtszustand der Seite, die Server.Transfer ruft ungültig auf der Zielseite.

Ansichtszustand Seite begrenzt und gilt nur für diese Seite. Ansichtszustand sollte nicht auf Seiten übertragen werden.

Problemlösung

Um dieses Problem zu beheben, verwenden Sie eine der folgenden Methoden.

Lösung 1

Übertragen von Werten zwischen Seiten auf dem Server Steuerelementwerte an andere Seiten übergeben. Weitere Informationen finden Sie auf der folgenden MSDN-Dokumentation:
Übergabe Server Steuerelementwerte zwischen Seiten
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
Dies erfordert, dass Sie öffentliche Eigenschaften für jede Eigenschaft eines Steuerelements erstellen, die Sie von der Zielseite zugreifen möchten.

Viele Steuerelemente haben und auf eine andere Seite Eigenschaften dieser Steuerelemente zugreifen möchten, können Sie diese Steuerelemente als öffentliche Variablen deklarieren. Beispiel:

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)

Lösung 2

Geben Sie nicht den zweiten Parameter (den falschen Standardeinstellung) Wenn Sie Server.Transferaufrufen. Beispiel:
Server.Transfer("<page name>")
Dieser Code sendet die Abfragezeichenfolge und die Felder auf der Seite keine, die aufgerufen wird. Wenn keine Daten übertragen, wird ASP.NET nicht Message Authentication Check ausgeführt.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen einer ASPX-Seite WebForm1.aspx, die Ausführung zu einer anderen Seite übertragen. Fügen Sie den folgenden Code zu WebForm1.aspx hinzu:
    <%@ 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. Erstellen Sie eine andere ASPX-Seite mit dem Namen WebForm2.aspx, und fügen Sie den folgenden Code hinzu:
    <%@ 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" in Ihrem Browser geöffnet, und klicken Sie dann auf Senden.
Eigenschaften

Artikelnummer: 316920 – Letzte Überarbeitung: 21.01.2017 – Revision: 1

Feedback