2011-07-06 11 views
5

Tôi đang sử dụng ASP.NET MVC 3 và có một số trang mà phần lớn Mô hình Xem là chỉ đọc. Một lĩnh vực ví dụ sẽ là như vậy:ASP.NET MVC 3 - Cách thực hành tốt nhất để xử lý Model trong View

<div class="display-label">My Field</div> 
<div class="display-field">@Model.MyField</div> 

sau đó tôi đã một lĩnh vực mà người dùng phải gõ vào một số văn bản xác minh như vậy:

@Html.LabelFor(model => model.Verification) 
@Html.PasswordFor(model => model.Verification) 

Khi người dùng gửi các hình thức và nó chạm của tôi điều khiển, các trường ViewModel là tất cả null trừ trường xác minh. Cách tôi đã nhận được xung quanh này, cho đến nay, là có một số lĩnh vực HiddenFor như vậy:

@Html.HiddenFor(model => model.MyField) 

Tuy nhiên, điều này trở nên xấu xí thực sự nhanh chóng. Có cách nào tốt hơn để xử lý mô hình trong trạng thái xem như vậy trong suốt quá trình gửi biểu mẫu, tôi có thể nhận tất cả các trường của tôi không? Điều này rất quan trọng trong trường hợp văn bản xác minh không khớp trong POST và tôi cần trả về mô hình khung nhìn mà không cần truy xuất lại nó từ cơ sở dữ liệu.

Cảm ơn mọi đề xuất.

Trả lời

3

Không có cách nào tốt hơn xung quanh nó mà không lấy lại giá trị từ cơ sở dữ liệu. Lý do là do mô hình ràng buộc của MVC chỉ nhìn vào các tham số GET hoặc POST để gắn kết MyField với mô hình của hành động, và nếu các tham số GET/POST không có giá trị MyField thì nó phải giữ thuộc tính đó là null (cách khác nó sẽ biết giá trị phải như thế nào?)

Để trình mô hình kết hợp xem giá trị MyField của bạn là chuyển nó vào các tham số GET/POST, và để thực hiện điều này, bạn phải nói rõ biểu mẫu của khung nhìn chuyển giá trị qua số Html.HiddenFor(). Không có cách nào để chế độ xem tự động biết để gửi thuộc tính đó trong thông số đăng/nhận.

Tuy nhiên một ý tưởng bạn có thể nhìn vào là để tạo ra một Razor (hoặc Html) phương pháp helper mà phải mất một tên trường và một biểu thức (các x => x.MyField) và ghi đầu ra sau cho bạn:

<div class="display-label">My Field</div> 
<div class="display-field">@Model.MyField</div> 
@Html.HiddenFor(model => model.MyField) 
.

điều này có nghĩa bạn chỉ cần viết một dòng mã (giống như @Html.ShowReadOnlyField(x => x.MyField, "My Field") thay vì những 3 dòng Tuy nhiên, điều này cũng giả định rằng ở khắp mọi nơi bạn muốn làm điều này sẽ có cấu trúc div cùng

Edit: Jus. Hãy ghi nhớ các vấn đề an ninh về các trường chỉ đọc, vì chúng không thực sự là chỉ đọc. Tốt hơn là lấy lại dữ liệu này từ cơ sở dữ liệu nếu dữ liệu này sẽ được sử dụng cho bất kỳ thứ gì trong bộ điều khiển, bởi vì mặc dù nó chỉ đọc trên biểu mẫu HTML, người dùng vẫn có thể đặt giá trị này thành bất kỳ thứ gì họ muốn bằng cách thao tác dữ liệu POST/GET.

+0

Bạn có thể nhận được các lo ngại về bảo mật bằng cách sử dụng trình trợ giúp '@ Html.AntiForgeryToken()'? – Brandon

+1

Tôi nghi ngờ điều đó. Tôi không biết nhiều về chức năng AntiForgeryToken, nhưng nhiều khả năng người dùng có thể xem mã nguồn của trang để xem mã thông báo nào họ cần cung cấp để hoạt động. Các mã thông báo giả mạo là nhiều hơn cho các cuộc tấn công kịch bản cross-site, không phải để bảo vệ giá trị, và bây giờ có cách để nó biết nếu một lĩnh vực có nghĩa là để được cung cấp hay không.Bất cứ điều gì có nghĩa là để được an toàn cần phải được xử lý phía máy chủ, và bạn không thể dựa vào các tính năng phía khách hàng cho an ninh – KallDrexx

+0

Tôi đã kết thúc chỉ cần tải lại đối tượng dụ của tôi trong bộ điều khiển. – Brandon

0

Vui lòng thử sắp xếp lại Mô hình trong Trang và sau đó đăng một bài đăng? Điều này nên giải quyết vấn đề.

<%= Html.Serialize("User",Model) %> 

[HttpPost] 
public ActionResult Register([DeserializeAttribute] User user, FormCollection userForm) 
{ 

} 
+0

Xin chào ViewState! –