2009-07-23 3 views
27

Sto imparando ASP.NET MVC e molti concetti di "ASP.NET" come l'autenticazione, l'autorizzazione, lo stato di sessione si applicano ancora ad esso.ViewState è rilevante in ASP.NET MVC?

Ma da tutto ciò che ho capito, non vedo che ViewState sia ancora rilevante in un'applicazione ASP.NET. Ma è lì (proprietà di System.Web.Mvc.ViewPage)! È lì solo per ragioni di compatibilità o ha ancora qualche scopo/uso?

+6

Questo tipo di domanda lo trovo molto utile. Non sto usando ASP.NET MVC in questo momento perché attualmente non sto facendo nulla per il web, ma voglio ancora saperlo, così posso prenderlo più rapidamente quando lo sto usando. – NeedHack

+0

correlati a http://stackoverflow.com/a/2230635/52277 –

risposta

6

Presente perché ViewPage eredita dalla Pagina. Tuttavia la Pagina stessa non ha avuto alcun utilizzo per ViewState utilizzato da WebControls. È possibile includere WebControls originali in una vista, ma in tal caso mancherebbe completamente il punto di separazione del controllo dalla vista.

+0

Il ragionamento è corretto ma ho scelto di accettare un'altra risposta perché risponde in modo decisivo! – Hemant

+0

Hai comunque il mio voto :) – Hemant

2

Personalmente penso che la sua obsoleta. L'unica volta che ho visto ViewState in un'applicazione ASP.Net MVC è quando qualcuno "accidentalmente" ha aggiunto un controllo ASP.Net a una pagina.

+8

Ricevo il messaggio ma poiché i moduli Web ASP.NET non sono obsoleti, ViewState non è obsoleto. Non è appena usato da ASP.NET ** MVC **! – Hemant

+0

È possibile imitare lo stato di visualizzazione in asp.net mvc –

3

ViewState non è rilevante, tuttavia ha fornito alcune grandi funzionalità. Non abbiamo dovuto ricaricare i dati ogni volta, né preoccuparci di mettere in cache ogni elemento, ecc. ViewState ha anche fornito un po 'di sicurezza - ha impedito un certo grado di manomissione dei moduli. Se hai associato una casella combinata, ha impedito alle persone di giocherellare con i valori come se fossero confrontati con il viewstate con hash e non avrebbero esito positivo la convalida se fosse stata modificata. A tal fine ViewState è stato abbastanza carino. Il problema è che è diventato molto grande nella maggior parte delle pagine in quanto le persone non hanno disattivato il viewstate per ciò di cui non avevano bisogno.

Ok - come risolvere questo? Il progetto MVC Futures di Microsoft contiene il metodo Html.Serialize e in combinazione con l'attributo [Deserialize] come parametro del metodo, questo ha fornito un controllo molto dettagliato su 'viewstate', ad esempio la serializzazione.

ex. nel controller:

 
[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(); 
     } 

e nella vista ho serializzare e utilizzarlo anche in un combo

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



+0

FWIW, Attualmente la mia preferenza è quella di memorizzare questi dati piuttosto che archiviarli sulla pagina, ma questa opzione viene fornita come opzione specialmente quando si esegue il porting di un'app moduli Web su mvc e non è disponibile la riprogettazione completa della pagina. –

0

Se è necessario si può imitare lo stato di visualizzazione con MVC3Futures project. Ti permetterà di salvare l'intero modello in vista.

Tutto quello che devi fare è serializzare il modello e crittografarlo in vista.

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

E nel controller aggiungere attributo deserializzato.

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