Ответ 1
Да, это правильно. ViewState не имеет значения. Подробнее о различиях между моделью страницы и MVC здесь:
Я изучаю ASP.NET MVC, и многие концепции "ASP.NET", такие как аутентификация, авторизация, состояние сеанса, по-прежнему применяются к нему.
Но из того, что я понял, я не вижу, что ViewState все еще имеет значение в приложении ASP.NET. Но он есть (свойство System.Web.Mvc.ViewPage)! Он существует только по соображениям совместимости или у него все еще есть какая-то цель/использование?
Да, это правильно. ViewState не имеет значения. Подробнее о различиях между моделью страницы и MVC здесь:
Его настоящее, потому что ViewPage наследуется от страницы. Однако сама страница не использовалась для ViewState, используемой WebControls. В представление можно включить оригинальные WebControls, но при этом полностью отсутствует точка разделения управления из представления.
ViewState не имеет отношения к делу, однако он обеспечивает отличную функциональность. Нам не приходилось каждый раз перезагружать данные или беспокоиться о кешировании каждого элемента и т.д. ViewState также обеспечил некоторую безопасность - это предотвратило определенную степень фальсификации формы. Если вы связали поле со списком, это заставило людей перебирать значения, поскольку они были сопоставлены с хеш-представлением и не подтвердили правильность, если он был запутан. Для этого ViewState был довольно приятным. Проблема в том, что на большинстве страниц он очень большой, так как люди не отключили viewstate для того, за что им это не нужно.
Хорошо - как это решить? Проект MVC Futures от Microsoft содержит метод Html.Serialize и в сочетании с атрибутом [Deserialize] в качестве параметра метода, который обеспечивает очень мелкозернистый контроль над "viewstate", то есть сериализацию.
ех. в контроллере:
[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(); }
а в сериализации View я и ALSO использовать его в комбо
@Html.Serialize("ShipTypes", ViewData["ShipTypes"]) @Html.DropDownList("ShipTypeId", ((List)ViewData["ShipTypes"]).ToSelectList("ShipTypeId", "Description"), new { @class = "combobox11" })
Лично я считаю его устаревшим. Единственный раз, когда я видел ViewState в приложении ASP.Net MVC, когда кто-то "случайно" добавил элемент ASP.Net на страницу.
Если вам нужно, вы можете имитировать состояние представления с помощью проекта MVC3Futures. Это позволит вам сохранить всю модель в поле зрения.
Все, что вам нужно сделать, это сериализовать модель и зашифровать ее в поле зрения.
@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned)
И в контроллере добавить десериализованный атрибут.
public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)