2009-07-23 2 views
27

Я изучаю ASP.NET MVC, и многие концепции «ASP.NET», такие как аутентификация, авторизация, состояние сеанса, по-прежнему применяются к нему.Является ли ViewState релевантным в ASP.NET MVC?

Но из того, что я понял, я не вижу, что ViewState все еще имеет значение в приложении ASP.NET. Но он есть (свойство System.Web.Mvc.ViewPage)! Он существует только по соображениям совместимости или у него все еще есть цель/использование?

+6

Этот вопрос я считаю очень полезным. Я не использую ASP.NET MVC прямо сейчас, потому что сейчас я вообще не занимаюсь веб-сайтом, но я все еще хочу знать об этом, чтобы быстрее его использовать, когда я его использую. – NeedHack

+0

Связано с http://stackoverflow.com/a/2230635/52277 –

ответ

8

Да, это правильно. ViewState не имеет значения. Подробнее о отличиями между Страница модели и MVC здесь:

Compatibility of ASP.NET Web Forms and ASP.NET MVC

+0

@ Jake1164: Работает для меня. – josh3736

+0

Полезный материал –

6

Его настоящее, потому что ViewPage наследуется от страницы. Однако сама страница не использовалась для ViewState, используемой WebControls. В представление можно включить оригинальные WebControls, но при этом полностью отсутствует точка разделения управления из представления.

+0

Вы рассуждаете правильно, но я решил принять другой ответ, потому что он отвечает решительно! – Hemant

+0

Вы получаете мой голос, хотя :) – Hemant

2

Лично я думаю, что его устаревшим. Единственный раз, когда я видел ViewState в приложении ASP.Net MVC, когда кто-то «случайно» добавил элемент управления ASP.Net на страницу.

+8

Получаю ваше сообщение, но поскольку веб-формы ASP.NET не устарели, ViewState также не устарел. Его просто не используется ASP.NET ** MVC **! – Hemant

+0

Можно имитировать состояние представления в asp.net mvc –

3

ViewState не имеет отношения к делу, однако он обеспечивает отличную функциональность. Нам не приходилось каждый раз перезагружать данные или беспокоиться о кешировании каждого элемента и т. Д. ViewState также обеспечивала некоторую безопасность - это предотвращало определенную степень вмешательства в форму. Если вы связали поле со списком, это заставило людей перебирать значения, поскольку они были сопоставлены с хеш-представлением и не подтвердили правильность, если он был запутан. Для этого ViewState был довольно приятным. Проблема в том, что на большинстве страниц он очень большой, так как люди не отключили viewstate для того, за что им это не нужно.

Хорошо - как это решить? Проект MVC Futures от Microsoft содержит метод Html.Serialize и в сочетании с атрибутом [Deserialize] в качестве параметра метода, который обеспечивает очень тонкий контроль над «viewstate», то есть сериализацию.

ex. в контроллере:

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

и в представлении я сериализовать его, а также использовать его в комбо

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



+0

FWIW. В настоящее время я предпочитаю кэшировать эти данные, а не хранить их на странице, но это предоставляется в качестве опции, особенно при переносе приложения веб-форм на mvc, и время полной редизайна страницы недоступно. –

0

Если вам нужно вы можете имитировать состояние представления с MVC3Futures project. Это позволит вам сохранить всю модель в поле зрения.

Все, что вам нужно сделать, это сериализовать модель и зашифровать ее в поле зрения.

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

И в контроллере добавить десериализованный атрибут.

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer) 
Смежные вопросы