2009-07-23 9 views
27

Estoy aprendiendo ASP.NET MVC y muchos conceptos de "ASP.NET" como autenticación, autorización, estado de sesión todavía se aplican a él.¿Es relevante ViewState en ASP.NET MVC?

Pero por lo poco que he entendido, no veo que ViewState siga siendo relevante en una aplicación ASP.NET. ¡Pero está allí (propiedad de System.Web.Mvc.ViewPage)! ¿Está allí solo por razones de compatibilidad o todavía tiene algún propósito/uso?

+6

Este tipo de pregunta me resulta muy útil. No estoy usando ASP.NET MVC en este momento porque en este momento no estoy haciendo nada en la web, pero aún así quiero saberlo para poder recuperarlo más rápido cuando lo estoy usando. – NeedHack

+0

Relacionado con http://stackoverflow.com/a/2230635/52277 –

Respuesta

6

Está presente porque ViewPage hereda de Page. Sin embargo, la página en sí no tenía ningún uso para ViewState es utilizado por WebControls. Es posible incluir WebControls originales en una Vista, pero al hacerlo faltaría por completo el punto de separar el control de la vista.

+0

¡Tu razonamiento es correcto, pero decidí aceptar otra respuesta porque responde con decisión! – Hemant

+0

Sin embargo, me dan mi voto :) – Hemant

2

Personalmente creo que es obsoleta. La única vez que he visto ViewState en una aplicación ASP.Net MVC es cuando alguien 'accidentalmente' agregó un control ASP.Net a una página.

+8

Aparece su mensaje, pero dado que los formularios web ASP.NET no están obsoletos, ViewState tampoco está obsoleto. Simplemente no es usado por ASP.NET ** MVC **! – Hemant

+0

Es posible imitar el estado de visualización en asp.net mvc –

3

ViewState no es relevante, sin embargo, proporcionó una gran funcionalidad. No tuvimos que volver a cargar datos cada vez, ni preocuparnos por el almacenamiento en caché de cada elemento, etc. ViewState también proporcionó algo de seguridad, evitando un cierto grado de alteración de forma. Si enlazó un cuadro combinado, impidió que las personas juguetearan con los valores ya que se compararon con el estado de visualización con hash y no se validaría si se cometió un error. Para este fin ViewState fue bastante agradable. El problema es que se hizo muy grande en la mayoría de las páginas, ya que las personas no desactivaron ViewState para lo que no necesitaban.

Ok, ¿cómo resolver esto? El proyecto MVC Futures de Microsoft contiene el método Html.Serialize y, junto con el atributo [Deserialize] como parámetro de método, proporciona un control muy detallado sobre 'viewstate', es decir, serialización.

ex. en el controlador:

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

y en la vista de lo serializarlo y también lo utilizan en un combo

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



+0

FWIW, Actualmente mi preferencia es almacenar estos datos en caché en lugar de almacenarlos en la página, pero esto se proporciona como una opción especialmente cuando se transfiere una aplicación de formularios web a mvc y no está disponible el momento de rediseñar una página completa. –

0

Si necesita usted puede imitar el estado de vista con MVC3Futures project. Le permitirá guardar todo el modelo a la vista.

Todo lo que tiene que hacer es serializar el modelo y encriptarlo en la vista.

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

Y en el atributo add deserialized del controlador.

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