2011-06-27 34 views
6

Tôi đang sử dụng dao cạo MVC3. Tôi có một kịch bản mà tôi phải sử dụng một phần xem nhiều lần trên cùng một khung nhìn cha mẹ. Vấn đề tôi gặp phải là khi Chế độ xem chính được hiển thị, nó sẽ tạo ra cùng tên và id của các điều khiển nhập trong các chế độ xem một phần đó. Vì lượt xem một phần của tôi được liên kết với các mô hình khác nhau, khi chế độ xem được đăng lại trên "Lưu", nó bị treo. Bất kỳ ý tưởng làm thế nào tôi có thể làm cho kiểm soát id/tên duy nhất, có lẽ một số tiền tố họ?Sử dụng một lần xem một phần Nhiều lần trên cùng một Chế độ xem cha mẹ

Đang chờ

Nabeel

Trả lời

5

Cá nhân tôi thích sử dụng các mẫu biên tập viên, khi họ chăm sóc này. Ví dụ, bạn có thể có mô hình sau đây xem:

public class MyViewModel 
{ 
    public ChildViewModel Child1 { get; set; } 
    public ChildViewModel Child2 { get; set; } 
} 

public class ChildViewModel 
{ 
    public string Foo { get; set; } 
} 

và bộ điều khiển sau:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Child1 = new ChildViewModel(), 
      Child2 = new ChildViewModel(), 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

và bên trong Index.cshtml xem:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <h3>Child1</h3> 
    @Html.EditorFor(x => x.Child1) 

    <h3>Child2</h3> 
    @Html.EditorFor(x => x.Child2) 
    <input type="submit" value="OK" /> 
} 

và phần cuối cùng là mẫu biên tập viên (~/Views/Home/EditorTemplates/ChildViewModel.cshtml):

@model ChildViewModel 

@Html.LabelFor(x => x.Foo) 
@Html.EditorFor(x => x.Foo) 

Sử dụng EditorFor bạn có thể bao gồm mẫu cho các thuộc tính khác nhau của mô hình chế độ xem chính và tên/id chính xác sẽ được tạo. Thêm vào đó, bạn sẽ nhận được mô hình xem của bạn đúng cách trong hành động POST.

2

Có một sự thay thế:

  1. Thêm một tiền tố cho PartialView
  2. Bind mô hình, loại bỏ các tiền tố

Đối với 1, thiết lập các tiền tố trong View của bạn:

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "prefix"; 

Đối với 2, bạn có thể khôi phục dữ liệu với UpdateModel, như sau:

UpdateModel(producto, "prefix"); 

Điều này không được khuyến khích vì hành động của bạn không nhận dữ liệu làm thông số, nhưng cập nhật mô hình sau. Điều này có một số bất tiện: 1) không rõ hành động của bạn cần gì khi nhìn vào chữ ký của nó 2) không dễ dàng cung cấp đầu vào cho hành động thử nghiệm đơn vị nó 3) hành động dễ bị xâm phạm các thông số (tham số do người dùng cung cấp) không nên ở đó và được ánh xạ tới mô hình).

Tuy nhiên, đối với 2 có một giải pháp thay thế: đăng ký Trình tạo mô hình tùy chỉnh cho phép bạn xóa tiền tố. Và Binder Model tùy chỉnh phải biết về nó.

Một giải pháp tốt là trong SO Q & A: How to handle MVC model binding prefix with same form repeated for each row of a collection? Nhưng nó có một chút sai sót: nếu bạn thêm trường ẩn có tên "__prefix" trong chế độ xem một phần và bạn hiển thị nó nhiều lần , ID này sẽ được lặp lại cho một số thành phần khác nhau trong trang, không được phép và có thể gây ra một số sự cố. Và một trong những lý do quan trọng nhất để cung cấp tiền tố chính xác là hiển thị cùng một chế độ xem "chỉnh sửa" dưới dạng lượt xem một phần cho một số trường hợp của một thực thể. I E.điều này sẽ xảy ra trong một trang như gmail, nơi bạn có thể chỉnh sửa nhiều email cùng một lúc.

Có một số giải pháp khả thi cho vấn đề này.

Một trong số họ đang cung cấp tiền tố làm chuỗi truy vấn hoặc giá trị định tuyến, và không phải là trường biểu mẫu, tránh xung đột Id và có thể được tìm thấy bởi trình kết nối mô hình. (Nó luôn có thể có cùng tên).

Một giải pháp khác là sử dụng trường ẩn, có mẫu cố định nhưng khác với mỗi chế độ xem được hiển thị. Tiền tố có thể tuân theo mẫu này cho tính duy nhất: "PP $ ActionControllerId" như "PP $ EditProduct23", là duy nhất cho mỗi chế độ xem được hiển thị và có thể dễ dàng tìm thấy giữa các tham số yêu cầu tìm kiếm bắt đầu bằng "PP $".

Và giải pháp cuối cùng là tạo tiền tố chỉ trong chế độ xem và không cung cấp tiền tố trong bất kỳ loại thông số yêu cầu nào. Trình liên kết mô hình sẽ phải tìm tiền tố kiểm tra tên của các tham số yêu cầu, cho đến khi nó tìm thấy một tiền tố có theo dõi mẫu.

Tất nhiên, ModelBinder tùy chỉnh phải được điều chỉnh để làm việc với quy ước đã chọn.

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