2009-07-23 39 views
27

Tôi đang học ASP.NET MVC và nhiều khái niệm về "ASP.NET" như xác thực, ủy quyền, trạng thái phiên vẫn áp dụng cho nó.ViewState có liên quan trong ASP.NET MVC không?

Nhưng từ bất kỳ điều gì tôi đã hiểu, tôi không thấy rằng ViewState vẫn có liên quan trong một ứng dụng ASP.NET. Nhưng nó là có (tài sản của System.Web.Mvc.ViewPage)! Có phải chỉ vì lý do tương thích hoặc nó vẫn có một số mục đích/sử dụng?

+6

Loại câu hỏi này tôi thấy rất hữu ích. Tôi không sử dụng ASP.NET MVC ngay bây giờ bởi vì tôi hiện không làm công cụ web ở tất cả, nhưng tôi vẫn muốn biết về nó vì vậy tôi có thể nhặt nó lên nhanh hơn khi tôi đang sử dụng nó. – NeedHack

+0

Liên quan đến http://stackoverflow.com/a/2230635/52277 –

Trả lời

6

Hiện tại của nó vì ViewPage được kế thừa từ Trang. Tuy nhiên, chính trang đó không sử dụng cho ViewState được sử dụng bởi WebControls. Có thể bao gồm WebControls ban đầu trong Chế độ xem nhưng làm như vậy sẽ hoàn toàn mất điểm kiểm soát tách khỏi chế độ xem.

+0

Bạn có lý do chính xác nhưng tôi đã chọn chấp nhận một câu trả lời khác vì nó trả lời dứt khoát! – Hemant

+0

Bạn nhận được phiếu bầu của tôi mặc dù :) – Hemant

2

Cá nhân tôi nghĩ lỗi thời của nó. Thời gian duy nhất tôi đã nhìn thấy ViewState trong một ứng dụng ASP.Net MVC là khi ai đó 'vô tình' thêm một điều khiển ASP.Net vào một trang.

+8

Tôi nhận được thư của bạn nhưng vì các biểu mẫu web ASP.NET không lỗi thời, ViewState cũng không lỗi thời. Nó không được sử dụng bởi ASP.NET ** MVC **! – Hemant

+0

Có thể bắt chước trạng thái xem trong asp.net mvc –

3

ViewState không liên quan, tuy nhiên nó cung cấp một số chức năng tuyệt vời. Chúng tôi không phải tải lại dữ liệu mỗi lần hoặc lo lắng về việc lưu vào bộ nhớ cache từng mục, v.v. ViewState cũng cung cấp một số bảo mật - nó ngăn cản một mức độ nhất định của biểu mẫu giả mạo. Nếu bạn bị ràng buộc một hộp kết hợp, nó ngăn chặn mọi người từ không quan trọng với các giá trị như những người đã được so sánh với các viewstate băm và sẽ không xác nhận nếu nó đã được điều sai. Để kết thúc này ViewState là khá tốt đẹp. Vấn đề là nó rất lớn trên hầu hết các trang vì mọi người không tắt chế độ xem cho những gì họ không cần.

Ok - cách giải quyết vấn đề này? Dự án MVC Futures của Microsoft chứa phương thức Html.Serialize và kết hợp với thuộc tính [Deserialize] như một tham số phương thức, điều này cung cấp khả năng kiểm soát hạt rất tốt đối với 'viewstate' - tức là tuần tự hóa.

ví dụ: trong bộ điều khiển:

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

và trong Xem Tôi serialize nó và CŨNG sử dụng nó trong một combo

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



+0

FWIW, Hiện tại sở thích của tôi là lưu dữ liệu này thay vì lưu trữ trên trang, nhưng điều này được cung cấp dưới dạng tùy chọn đặc biệt khi chuyển ứng dụng biểu mẫu web sang mvc và thời gian thiết kế lại toàn bộ trang không khả dụng. –

0

Nếu bạn cần, bạn có thể bắt chước view state với MVC3Futures project. Nó sẽ cho phép bạn lưu toàn bộ mô hình trong chế độ xem.

Tất cả những gì bạn phải làm là sắp xếp lại mô hình và mã hóa nó trong chế độ xem.

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

Và trong bộ điều khiển thêm thuộc tính deserialized.

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer) 
Các vấn đề liên quan