PRB: "stav zobrazení je neplatná" chybová zpráva při použití metody Server.Transfer

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Příznaky

Při použití HttpServerUtility.Transfer ("název stránky", true), zobrazí se následující chybová zpráva:
Stav zobrazení je neplatný pro tuto stránku a může být poškozen.

Příčina

K tomuto problému dochází, protože elementu < pages > atribut EnableViewStateMac je nastavena na true ve výchozím nastavení. Pokud je tento atribut nastaven na hodnotu true, technologie ASP.NET spuštěna kontroly ověřování zpráv (MAC) ve stavu zobrazení stránky, když je stránka odeslána zpět od klienta. Toto políčko určuje, pokud v klientském počítači byl změněn stav zobrazení stránky. Z bezpečnostních důvodů doporučujeme, abyste tento atribut nastaven na hodnotu true.

Při volání metody Server.Transfer a druhý parametr nastaven na hodnotu true, zachovat QueryString a Form kolekce. Jedno z polí formuláře je __VIEWSTATE skryté pole formuláře, který obsahuje stav zobrazení pro stránku. Kontrola zobrazení stavu zprávy ověřování se nezdaří, protože kontroly ověřování zpráv pouze zkontroluje každou stránku. Stav zobrazení ze stránky, která volá Server.Transfer proto není platný na cílové stránce.

Stav zobrazení je s rozsahem stránky a platí pouze pro tuto stránku. Na stránkách není vhodné přenést stav zobrazení.

Řešení

Chcete-li vyřešit tento problém, použijte jednu z následujících metod.

Řešení 1

Převod hodnot mezi stránkami serveru řízení hodnoty předat jiné stránky Chcete-li. Další informace naleznete v následující dokumentaci MSDN:
Hodnoty řízení serveru předávání mezi stránkami
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
To vyžaduje vytvoření veřejné vlastnosti pro každou vlastnost ovládacího prvku, který chcete získat přístup z cílové stránky.

Pokud máte mnoho ovládacích prvků a chcete získat přístup z jiné stránky vlastnosti těchto ovládacích prvků, můžete také deklarovat tyto ovládací prvky jako veřejné proměnné. Například:

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)

Řešení 2

Neprojde druhý parametr (což je false ve výchozím nastavení) při volání metody Server.Transfer. Například:
Server.Transfer("<page name>")
Tento kód neodešle QueryString a pole formuláře na stránce, která je volána. Pokud nejsou převedena žádná data, technologie ASP.NET nespustí kontroly ověřování zpráv.

Další informace

Kroky pro reprodukci chování

  1. Vytvořte stránku ASPX s názvem WebForm1.aspx, který převádí spuštění na jinou stránku. Přidejte následující kód do souboru 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. Vytvořit jinou stránku ASPX s názvem WebForm2.aspx a přidejte následující kód:
    <%@ 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. V prohlížeči otevřete WebForm1.aspx a potom klepněte na tlačítko Odeslat.
Vlastnosti

ID článku: 316920 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor