ASP.NET 4.0: ViewStateMode...σας δίνει περισσότερο έλεγχο πάνω από το ViewState!
Το ViewState είναι ένας πόνος...εκεί, το έχω πει! Αυτό που προκαλεί τον περισσότερο πόνο με το ViewState είναι το γεγονός ότι οι άνθρωποι το κακομεταχειρίζονται πολύ, αφήνοντας το ενεργοποιημένο για κάθε έλεγχο σε μια σελίδα, όταν στην πραγματικότητα το χρειάζεστε μόνο για αυτό το ένα έλεγχο που πραγματικά πρέπει να επιμείνει σε αυτό το περιεχόμενο στην επόμενη σελίδα. Ντέιβ Ριντ. ένας προγραμματιστής στην ομάδα ASP.NET έχει γράψει μια πραγματικά επική θέση για Αληθινά Κατανοητό Κράτος Προβολής, και πριν διαβάσεις τι θα ακολουθήσει, πραγματικά πρέπει να φύγεις και να διαβάσεις πρώτα
Πίσω;
Εντάξει, τώρα καταλαβαίνετε ότι θα πρέπει να χρησιμοποιήσετε μόνο ViewState για εκείνους τους ελέγχους που πραγματικά το χρειάζονται. Αλλά υπάρχει ένα πρόβλημα...αυτό που πραγματικά θέλετε να κάνετε είναι να απενεργοποιήσετε ViewState για μια ολόκληρη σελίδα και στη συνέχεια απλά να την ενεργοποιήσετε ξανά για τους ελέγχους που το χρειάζονται, Συγνώμη, αλλά έχω κάποια άσχημα νέα, μπορείτε να το κάνετε αυτό σε οποιαδήποτε έκδοση του ASP.NET μέχρι και συμπεριλαμβανομένου ASP.NET 3.5 SP1. Έχω επίσης κάποια καλά νέα...θα είστε σε θέση να το κάνετε αυτό όταν ASP.NET 4.0 βγαίνει! Η μαγική μικρή ιδιοκτησία σε όλους τους ελέγχους ASP.NET που σας επιτρέπει να το κάνετε αυτό ονομάζεται ViewStateMode. (Παρεμπιπτόντως, αυτό ήταν Ντέιβ ιδέα και τα δείγματα παρακάτω είναι ένα ξεδιάντροπο rip-off από αυτόν:-)
Βάλτε πολύ απλά, ViewStateMode έχει 3 πιθανές τιμές, Ενεργοποιημένο, Άτομα με ειδικές ανάγκες και ΚληρονομιάΤα οποία είναι αρκετά προφανή στη λειτουργία τους...Ενεργοποιημένο turns saving ViewState on για τον εν λόγω έλεγχο (ή οποιοδήποτε παιδικό χειριστήριο που έχει οριστεί ως "Inherit" ή δεν έχει οριστεί τίποτα), Άτομα με ειδικές ανάγκες Κλείστε το πάλι, και Κληρονομιά Είπε να χρησιμοποιήσουμε ό, τι ο γονέας μου είναι έτοιμος για να το κάνουμε. Αυτό είναι πραγματικά το μόνο που υπάρχει σε αυτό!
Εδώ είναι ένα πολύ απλό δείγμα του πώς λειτουργεί πραγματικά:
<μορφή id="form1" runat="server">
<script runat=Λοιπόν, σερβιτόρε>
Προστατευόμενο κενό παράκαμψης OnLoad (EventArgs e) {
{IsPostBack) {
label1.Text = label2.Text = "[ΔυναμικήValue],"
}
βάση. OnLoad (e) ·
}
</Σχέδιο>
<asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled">
Άτομα με ειδικές ανάγκες: <asp:Label ID="label1" runat="server" Text="[ΔηλώθηκεValue]" /><br />
<asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled">
Ενεργοποιημένο: <asp:Label ID="label2" runat="server" Text="[ΔηλώθηκεValue]" />
</asp:PlaceHolder>
</asp:PlaceHolder>
<hr />
<asp:button ID="Button1" runat="server" Text="Postback" />
Όπως μπορείτε να δείτε σε αυτό το δείγμα μπορούμε να Disabling ViewState for the PlaceHolder1, η ετικέτα του παιδιού1 Κληρονομεί αυτό το ακίνητο (όπως η κληρονομιά είναι προεπιλεγμένη) και ως εκ τούτου δεν αποθηκεύει καμία άποψηStateIn PlaceHolder2 we set ViewStateMode to Enabled BAR, which leads to label2 inheriting this property and some saves ViewStateOn the first page load we set both labels to the exput the text [DynamicValue]
Το αποτέλεσμα όλων αυτών είναι ότι, όταν το πρώτο φορτίο της σελίδας βλέπετε τις ετικέτες να αποδίδονται ως εξής:
Άτομα με ειδικές ανάγκες: [DynamicValue]
Ενεργοποιημένο: [DynamicValue]
Αλλά, κάνε ένα PostBack και βλέπεις:
Άτομα με ειδικές ανάγκες: [ΔηλώθηκεValue]
Ενεργοποιημένο: [DynamicValue]
Όπως περιμένατε τώρα, η πρώτη ετικέτα δεν έχει διατηρήσει την αξία που βάλαμε στο ViewState η δεύτερη ετικέτα έχει!
Αυτό που είναι πραγματικά δροσερό είναι το γεγονός ότι μπορείτε επίσης να το κάνετε αυτό:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" ViewStateMode="Disabled" %>
Να θυμάστε, στο WebForms Page είναι απλά ένας άλλος έλεγχος... λειτουργεί ως γονικός έλεγχος για κάθε άλλο έλεγχο στη σελίδα. Αυτό σημαίνει ότι κανένας έλεγχος δεν θα σώσει το ViewState εκτός αν ορίσετε το ViewStateMode σε Ενεργοποίηση για τον εν λόγω έλεγχο ή έναν έλεγχο περαιτέρω μέχρι την ιεραρχία ελέγχου (έτσι, μια μεγάλη χρήση θα ήταν για ContentPlaceHolders σε MasterPages...).
Στο είπα ότι ήταν απλό!