2009-07-23 83 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)