2009-07-23 7 views
27

Ich lerne ASP.NET MVC und viele Konzepte von "ASP.NET" wie Authentifizierung, Autorisierung, Sitzungsstatus gelten immer noch für sie.Ist ViewState in ASP.NET MVC relevant?

Aber von was auch immer ich verstanden habe, sehe ich nicht, dass ViewState immer noch in einer ASP.NET-Anwendung relevant ist. Aber es ist da (Eigenschaft von System.Web.Mvc.ViewPage)! Ist es nur aus Kompatibilitätsgründen da, oder hat es noch einen Zweck?

+6

Diese Art von Frage finde ich sehr nützlich. Ich benutze momentan kein ASP.NET MVC, weil ich momentan keine Web-Sachen mache, aber ich möchte immer noch etwas darüber wissen, damit ich es schneller aufnehmen kann, wenn ich es benutze. – NeedHack

+0

Bezogen auf http://StackOverflow.com/a/2230635/52277 –

Antwort

6

Es ist vorhanden, da ViewPage von Page erbt. Die Seite selbst hatte jedoch für ViewState keine Verwendung, da sie von WebControls verwendet wurde. Es ist zwar möglich, Original-Websteuerelemente in eine Ansicht einzufügen, aber dabei würde der Punkt der Trennung der Steuerung von der Ansicht vollständig fehlen.

+0

Sie Argumentation ist richtig, aber ich entschied mich, eine andere Antwort zu akzeptieren, weil es entschieden beantwortet! – Hemant

+0

Sie bekommen meine Stimme obwohl :) – Hemant

2

Ich persönlich denke, seine veraltet. Das einzige Mal, dass ich ViewState in einer ASP.Net MVC-App gesehen habe, ist, wenn jemand versehentlich einer Seite ein ASP.Net-Steuerelement hinzugefügt hat.

+8

Ich bekomme Ihre Nachricht, aber da ASP.NET Web Forms nicht veraltet sind, ist ViewState auch nicht veraltet. Es wird nicht von ASP.NET verwendet ** MVC **! – Hemant

+0

Es ist möglich, den Ansichtszustand in asp zu imitieren.net mvc –

3

ViewState ist nicht relevant, bietet jedoch einige großartige Funktionen. Wir mussten die Daten nicht jedes Mal neu laden oder uns um die Zwischenspeicherung jedes Elements usw. kümmern. ViewState bot auch einige Sicherheit - es verhinderte ein gewisses Maß an Manipulation der Form. Wenn Sie ein Kombinationsfeld begrenzen, werden die Leute daran gehindert, mit den Werten zu experimentieren, die mit dem Hash-View-Status verglichen wurden, und die Validierung würde fehlschlagen, wenn sie durcheinander gebracht würde. Zu diesem Zweck war ViewState ziemlich nett. Das Problem ist, dass es auf den meisten Seiten sehr groß wurde, da die Leute den Viewstatus nicht ausgeschaltet haben, wofür sie ihn nicht brauchten.

Ok - wie löst man das? Das MVC-Futures-Projekt von Microsoft enthält die Html.Serialize-Methode und in Verbindung mit dem [Deserialize] -Attribut als Methodenparameter bot dies eine sehr feine Kontrolle über 'Viewstate' - dh Serialisierung.

ex. in der Steuerung:

 
[HttpGet] 
     public ActionResult Index() 
     { 
      OrderRepository repository = new OrderRepository(); 
      var shipTypes = repository.GetAllShipTypes(); 
      var orders = repository.GetAllOrders(); 
      ViewBag.ShipTypes = shipTypes; 
      return View(orders.First()); 
     } 

     [HttpPost] 
     public ActionResult Index(Order order, [Deserialize] List<ShipType> shipTypes) 
     { 
      //Note order.ShipTypeId is populated. 
      ViewBag.ShipTypes = shipTypes; 
      return View(); 
     } 

und in der Ansicht ich es serialisiert werden und es auch in einer Combo

 
@Html.Serialize("ShipTypes", ViewData["ShipTypes"]) 
     @Html.DropDownList("ShipTypeId", ((List)ViewData["ShipTypes"]).ToSelectList("ShipTypeId", "Description"), new { @class = "combobox11" }) 



+0

FWIW, Derzeit ist meine Vorliebe, diese Daten zwischenzuspeichern, anstatt auf der Seite zu speichern, aber dies wird als eine Option insbesondere bei der Portierung einer Web Forms App auf MVC zur Verfügung gestellt und die Zeit für eine komplette Seite Redesign ist nicht verfügbar. –

0

Wenn Sie verwenden müssen Sie den Ansichtszustand mit MVC3Futures project imitieren können. Damit können Sie das gesamte Modell im Blick behalten.

Alles, was Sie tun müssen, ist das Modell zu serialisieren und es in Sicht zu verschlüsseln.

@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned) 

Und im Controller deserialisierten Attribut hinzufügen.

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)