PRB: "Προβολή κατάσταση δεν είναι έγκυρη" μήνυμα λάθους όταν χρησιμοποιείτε Server.Transfer

Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής βάσης που έχει αποσυρθεί

Αυτό το άρθρο αφορά προϊόντα για τα οποία η Microsoft δεν παρέχει πλέον υποστήριξη. Συνεπώς, το παρόν άρθρο παρέχεται "ως έχει" και δεν θα ενημερώνεται πλέον.

Συμπτώματα

Όταν χρησιμοποιείτε HttpServerUtility.Transfer ("όνομα σελίδας", true), λαμβάνετε το ακόλουθο μήνυμα λάθους:
Η κατάσταση προβολή δεν είναι έγκυρη για αυτήν τη σελίδα και μπορεί να είναι κατεστραμμένο

Αιτία

Αυτό το ζήτημα παρουσιάζεται επειδή το EnableViewStateMac χαρακτηριστικό του στοιχείου < σελίδες > ορίζεται στην τιμή true , από προεπιλογή. Όταν αυτό το χαρακτηριστικό έχει οριστεί στην τιμή true, το ASP.NET εκτελείται ένας έλεγχος ταυτότητας μηνυμάτων (MAC) σχετικά με την κατάσταση προβολής της σελίδας όταν καταχωρείται η σελίδα πίσω από τον υπολογιστή-πελάτη. Ο έλεγχος αυτός προσδιορίζει εάν η κατάσταση προβολής της σελίδας τροποποίησης του υπολογιστή-πελάτη. Για λόγους ασφαλείας, συνιστάται να διατηρείτε αυτή η ιδιότητα οριστεί στην τιμή true.

Όταν καλείτε τη μέθοδο Server.Transfer και ορίστε τη δεύτερη παράμετρο στην τιμή true, μπορείτε να διατηρήσετε τη συμβολοσειρά ερωτήματος και τις συλλογές φόρμας . Ένα από τα πεδία φόρμας είναι το πεδίο φόρμας κρυφό __VIEWSTATE, το οποίο διατηρεί την κατάσταση προβολής της σελίδας. Ο έλεγχος ταυτότητας προβολή κατάσταση μήνυμα αποτυγχάνει, επειδή ο έλεγχος ταυτότητας μηνυμάτων ελέγχει μόνο την κάθε σελίδα. Επομένως, η κατάσταση προβολής από τη σελίδα που καλεί Server.Transfer δεν είναι έγκυρη στη σελίδα προορισμού.

Προβολή κατάστασης είναι σελίδα στοχεύουν και είναι έγκυρη για αυτήν τη σελίδα μόνο. Κατάσταση προβολής δεν πρέπει να μεταφερθούν σε δύο σελίδες.

Προτεινόμενη αντιμετώπιση

Για να επιλύσετε αυτό το ζήτημα, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους.

Προτεινόμενη αντιμετώπιση 1

Μεταφέρετε τιμές μεταξύ σελίδων για να μεταβιβάσετε το διακομιστή τιμές των στοιχείων ελέγχου στις άλλες σελίδες. Για περισσότερες πληροφορίες, ανατρέξτε την ακόλουθη τεκμηρίωση του MSDN:
Διαβίβαση διακομιστή ελέγχου τιμές μεταξύ σελίδων
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
Αυτό απαιτεί να δημιουργήσετε δημόσιες ιδιότητες για κάθε ιδιότητα ενός στοιχείου ελέγχου που θέλετε να έχετε πρόσβαση από τη σελίδα προορισμού.

Εάν έχετε πολλά στοιχεία ελέγχου, και εάν θέλετε να αποκτήσετε πρόσβαση στις ιδιότητες αυτών των στοιχείων ελέγχου από μια άλλη σελίδα, μπορείτε να δηλώσετε επίσης αυτά τα στοιχεία ελέγχου ως δημόσια μεταβλητές. Για παράδειγμα:

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

Δεν περάσουν τη δεύτερη παράμετρο (το οποίο είναι false από προεπιλογή) όταν καλείτε τη μέθοδο Server.Transfer. Για παράδειγμα:
Server.Transfer("<page name>")
Αυτός ο κώδικας δεν στέλνει τη συμβολοσειρά ερωτήματος και πεδία φόρμας στη σελίδα που ονομάζεται. Όταν δεν υπάρχουν δεδομένα μεταφέρονται, ASP.NET δεν εκτελείται ο έλεγχος ταυτότητας του μηνύματος.

Περισσότερες πληροφορίες

Βήματα για την αναπαραγωγή της συμπεριφοράς

  1. Δημιουργήστε μια σελίδα .aspx με το όνομα αρχείο WebForm1.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. Δημιουργήστε μια άλλη σελίδα .aspx με το όνομα WebForm2.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 στο πρόγραμμα περιήγησης και, στη συνέχεια, κάντε κλικ στο κουμπί υποβολής.
Ιδιότητες

Αναγνωριστικό άρθρου: 316920 - Τελευταία αναθεώρηση: 16 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια