ViewState是否与ASP.NET MVC相关?

时间:2009-07-23 09:48:17

标签: .net asp.net asp.net-mvc viewstate

我正在学习ASP.NET MVC,许多“ASP.NET”概念,如身份验证,授权,会话状态仍然适用于它。

但是从我所理解的一点点来看,我都没有看到ViewState在ASP.NET应用程序中仍然具有相关性。但它存在(System.Web.Mvc.ViewPage的属性)!是仅出于兼容性原因还是有一些目的/用途?

5 个答案:

答案 0 :(得分:8)

是的,这是正确的。 ViewState不相关。有关Page Model和MVC之间差异的更多信息,请点击此处:

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

答案 1 :(得分:6)

它的存在是因为ViewPage继承自Page。但是,Page本身对WebControls使用的ViewState没有用处。可以在视图中包含原始WebControl,但这样做完全没有将控制与视图分开的点。

答案 2 :(得分:3)

ViewState不相关,但它提供了一些很棒的功能。我们不必每次都重新加载数据,或者担心缓存每个项目等。 ViewState还提供了一些安全性 - 它阻止了某种程度的形式篡改。如果绑定了一个组合框,它会阻止人们摆弄这些值,因为这些值与散列的视图状态进行了比较,如果它被搞砸了则验证失败。为此,ViewState非常好。问题是它在大多数页面上变得非常大,因为人们没有因为他们不需要它而关闭viewstate。

好的 - 如何解决这个问题? Microsoft的MVC Futures项目包含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();
        }

并在视图中我序列化它并且还在组合中使用它

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



答案 3 :(得分:2)

我个人觉得它已经过时了。我在ASP.Net MVC应用程序中看到ViewState的唯一一次是当有人'意外'将ASP.Net控件添加到页面时。

答案 4 :(得分:0)

如果您需要,可以使用MVC3Futures project模仿查看状态。它可以让你保存整个模型。

您所要做的就是序列化模型并在视图中对其进行加密。

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

在控制器中添加反序列化属性。

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