Es ViewState relevante en ASP.NET ¿MVC?


Estoy aprendiendo ASP.NET MVC y muchos conceptos de "ASP.NET" al igual que la autenticación, la autorización, el estado de la sesión todavía se aplican a él.

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

Author: Hemant, 2009-07-23

5 answers

Sí, eso es correcto. ViewState no es relevante. Más sobre las diferencias entre el Modelo de página y MVC aquí:

Compatibilidad de ASP.NET Formularios Web y ASP.NET MVC

 8
Author: Dzmitry Huba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-02 22:01:57

Está presente porque ViewPage hereda de Page. Sin embargo Página en sí no tenía uso para ViewState su utilizado por WebControls. Es posible incluir WebControls originales en una vista, pero hacerlo sería perder por completo el punto de separar el control de la vista.

 6
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 09:52:46

ViewState no es relevante, sin embargo proporcionó una gran funcionalidad. No tuvimos que recargar datos cada vez, ni preocuparnos por almacenar en caché cada elemento, etc. ViewState también proporcionó cierta seguridad: evitó un cierto grado de manipulación de formularios. Si enlazó un cuadro combinado, evitó que las personas juguetearan con los valores ya que se compararon con el estado de vista con hash y fallaría la validación si se alteraba. Con este fin ViewState fue bastante agradable. El problema es que se hizo muy grande en la mayoría de las páginas como personas no desactivaron viewstate para lo que no lo necesitaban.

Ok - ¿cómo resolver esto? El proyecto MVC Futures de Microsoft contiene el Html.Método Serialize y junto con el atributo [Deserialize] como parámetro de método, esto proporcionó un control muy fino 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 lo serializo y TAMBIÉN lo uso en un combo

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



 3
Author: Adam Tuliper - MSFT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-24 18:01:56

Personalmente creo que es obsoleto. La única vez que he visto ViewState en un ASP.Net MVC app es cuando alguien' accidentalmente ' añadió un ASP.Net control a una página.

 2
Author: eyesnz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 09:54:34

Si lo necesita, 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 cifrarlo a la vista.

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

Y en el controlador agregue el atributo deserializado.

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)
 0
Author: jan salawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-20 08:27:33