2012-10-19 36 views
5

Tôi có một ứng dụng ASP.NET MVC hiển thị danh sách các mục. Theo quan điểm của trang tôi vòng lặp của tôi so với các mặt hàng và làm cho mỗi mục với xem một phần, như vậy:Html.HiddenFor ràng buộc với phần tử sai

@foreach(var item in Model.items) 
{ 
    <li> 
     @Html.Partial("ItemView", item) 
    </li> 
} 

Trong giao diện mục, tôi quấn mỗi mục với một hình thức mà có một nút 'Delete', như thế này:

@using(Html.BeginForm(...)) 
{ 
    @Html.HiddenFor(m=>m.Id) 
    <label>@Model.Name (@Model.Id)</label> 
    <input type="submit" value="Delete"/> 
} 

Các mục được hiển thị chính xác, trang kết quả có danh sách đẹp tất cả các mục có tên và ID thích hợp được hiển thị.

CHỈNH SỬA: Điều tương tự cũng xảy ra với @Hidden, rõ ràng, trái ngược với những gì tôi đã viết trước đây.

Ngoài ra, điều này chỉ xảy ra lần thứ hai biểu mẫu được hiển thị (nghĩa là sau khi một trong các nút Xóa được nhấp), lần đầu tiên mọi thứ hoạt động bình thường. Các phương thức hành động của tôi trông giống như sau:

public ActionResult AllItems() 
{ 
    var model = new AllItemsModel(); 
    return PartialView(model); 
} 

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 
    return PartialView("AllItems", new AllItemsModel()); 
} 

Tại sao điều này xảy ra?

Trả lời

8

Tôi nghi ngờ rằng điều này xảy ra vì bạn đã có một tham số Id trong RouteData của bạn:

public ActionResult SomeAction(int id) 
{ 
    var model = ... 
    return View(model); 
} 

và bạn đã yêu cầu trang với /somecontroller/someaction/123. Trình trợ giúp HiddenFor giờ đây sử dụng Id từ các giá trị tuyến đường chứ không phải id của mục. Hãy thử đổi tên thuộc tính trên mô hình chế độ xem mục của bạn thành một cái gì đó khác với id. Ví dụ: ItemId.

Một khả năng khác là sự cố chỉ xảy ra sau khi đăng lại chứ không phải khi trang được hiển thị ban đầu. Hiển thị hành động POST của bạn có thể giúp khám phá thêm khả năng này.


UPDATE:

Được rồi, bây giờ mà bạn đã chỉ ra POST thứ hành động của bạn được nhiều hơn rõ ràng hơn:

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 
    return PartialView("AllItems", new AllItemsModel()); 
} 

cơ bản bạn đang tạo ra một mô hình quan điểm mới ở đây và đi qua nó để xem một phần. Nhưng những người trợ giúp HTML luôn sử dụng giá trị từ ModelState khi liên kết. Và chỉ sau đó giá trị từ mô hình xem của bạn. Vì vậy, nếu bạn dự định sửa đổi các thuộc tính trên mô hình của mình bên trong hành động POST của bạn, hãy đảm bảo rằng bạn đã xóa giá trị này khỏi ModelState trước. Trong ví dụ của bạn kể từ khi bạn đã hoàn toàn bị trầy xước toàn bộ mô hình điểm (bằng cách tạo ra một new AllItemsModel()), bạn có thể xóa toàn bộ ModelState:

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 

    // Clear the modelstate otherwise the view will use the values that were initially posted 
    // and not the values from your view model 
    ModelState.Clear(); 
    return PartialView("AllItems", new AllItemsModel()); 
} 

Hành vi này là do thiết kế và áp dụng cho tất cả những người giúp đỡ HTML, không chỉ các helper HiddenFor.

+0

Chà, quan sát tuyệt vời. Tôi sẽ kiểm tra, tôi nghĩ rằng tôi không có. – zmbq

+0

Đề xuất đầu tiên của bạn không đúng, nhưng đề xuất thứ hai của bạn có vẻ đầy hứa hẹn. Quá tệ tôi không thể +1 hai lần ... tôi sẽ kiểm tra. – zmbq

+0

Vâng, đó là chính xác nó. Cảm ơn rất nhiều! – zmbq

Các vấn đề liên quan