2009-07-23 84 views
27

我正在学习ASP.NET MVC,许多“ASP.NET”的概念,如认证,授权,会话状态仍然适用于它。ASP.NET MVC中ViewState是否相关?

但是,无论我了解多少,我都没有看到ViewState在ASP.NET应用程序中仍然相关。但它在那里(System.Web.Mvc.ViewPage的属性)!它仅出于兼容性原因还是仍然有一定的目的/用途?

+6

这种问题我觉得非常有用。我现在不使用ASP.NET MVC,因为我目前不在使用网络资源,但我仍然想知道它,所以我可以在使用它时更快地找到它。 – NeedHack 2009-07-23 10:05:59

+0

相关http://stackoverflow.com/a/2230635/52277 – 2012-05-10 21:42:39

回答

6

由于ViewPage继承自Page,因此存在它。但是页面本身没有使用WebControls使用的ViewState。将原始的WebControls包含在View中是可能的,但是这样做完全可能会忽略从视图中分离控制的问题。

+0

你推理是正确的,但我选择接受另一个答案,因为它果断回应! – Hemant 2009-07-23 10:26:13

+0

虽然你得到我的投票:) – Hemant 2009-07-23 10:26:47

2

我个人认为它已经过时了。我唯一一次在ASP.Net MVC应用程序中看过ViewState的时候,是有人'不小心'在页面上添加了一个ASP.Net控件。

3

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

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

,并在查看序列化它,如果你还需要你可以模仿视图状态MVC3Futures project使用它在组合

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



0

。它可以让你保存整个模型。

您只需序列化模型并在视图中对其进行加密即可。

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

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

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