2010-03-09 60 views
11

Tôi tin rằng câu hỏi này áp dụng cho bất kỳ "Đối với" người giúp đỡ Html, nhưng vấn đề cụ thể của tôi đang sử dụng CheckBoxFor ...Foreach về sở hữu IEnumerable và CheckBoxFor trong ASP.Net MVC

Tôi có một mô hình đó là của gõ IEnumerable, trong đó quyền là một POCO đơn giản. Mô hình này thực sự là một thuộc tính của một mô hình lớn hơn mà tôi đã tạo một EditorTemplate cho. Đây là hình ảnh lớn hơn của mô hình của tôi:

public class bigmodel 
{ 
    public string Title {get; set;} 
    public string Description {get; set;} 

    [UIHint("ListRights")] 
    public IEnumerable<rights> Rights {get;set;} 
} 

public class rights 
{ 
    public bool HasAccess {get; set;} 
    public string Description {get;set;} 
} 

Tôi đã tạo một bản chỉnh sửa được gọi là "ListRights" mà chế độ xem chính của tôi sử dụng. Ví dụ: <% = Html.EditorFor (m => m.Rights)%>.

Trong ListRights.ascx, tôi muốn mã như thế này:

<table> 
    <% foreach(rights access in Model) 
    { %> 
     <tr> 
     <td> 
      <%=Html.CheckBoxFor(access) %> 
     </td> 
     <td> 
      <%=access.Description %> 
     </td> 
     </tr> 
    <% } %> 
</table> 

Tôi biết dòng CheckBoxFor không làm việc, nhưng tôi muốn làm điều gì đó mà tạo ra kết quả tương tự, như thể truy cập là một tài sản trên ngươi mâu.

Trong ví dụ trên, tôi muốn mọi thứ tự động đăng trên bài đăng.

tôi đã cố gắng giả mạo CheckBox với mã tương tự như sau, nhưng nó không autobind:

<table> 
    <% for(int i=0; i < Model.Count(); i++) 
    { %> 
     <tr> 
     <td> 
      <%=Html.CheckBox(string.Format("[{0}].HasAccess",i), Model.ElementAt(i).HasAccess)%> 
     </td> 
     <td> 
      <%=access.Description %> 
     </td> 
     </tr> 
    <% } %> 
</table> 

Bất kỳ lời đề nghị?

Trả lời

5

Tôi tìm thấy câu trả lời bằng cách sử dụng một bài đăng blog của Steve Sanderson tại http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Sử dụng "Html.BeginCollectionItem" làm việc trong hoàn cảnh của tôi.

Tôi đã tạo một EditorTemplate cho các quyền (trong ví dụ của tôi). Sau đó, thêm BeginCollectionItem của Steve vào mẫu đó. Tôi đã gọi mẫu bằng cách sử dụng Html.RenderPartial như được đề xuất trong blog của Steve.

Tôi muốn sử dụng Html.EditorFor (m => m.item), nhưng điều đó không hoạt động vì mục nằm trong ForEach chứ không phải trong mô hình. EditorFor có thể được sử dụng trong trường hợp này?

+0

tôi không thực sự nhận được câu trả lời này, tại sao bạn lại trải qua tất cả những rắc rối này? – mare

+0

ok, sau khi một số suy nghĩ nhiều hơn và đi đến blog của Steven tôi thấy những gì bạn đang cố gắng để đạt được. Các giải pháp của Steve hoạt động trong trường hợp này. Mặc dù tôi không nghĩ rằng trải nghiệm người dùng là bất kỳ tốt trong trường hợp này - chỉnh sửa nhiều mục theo cách này và đăng tất cả chúng trở lại bộ điều khiển trong một lần. – mare

12

Tôi đoán bạn có vấn đề bởi vì đây không làm việc

<%=Html.CheckBoxFor(access) %> 

và điều này không làm việc, hoặc

<%=Html.CheckBoxFor(access=>access.HasAccess) %> 

nhưng điều này nên làm việc

<%=Html.CheckBoxFor(x=>access.HasAccess) %> 
+0

Cảm ơn! Điều này đã làm cho cuộc sống của tôi dễ dàng hơn! – Craig

+0

Bạn tiết kiệm cho tôi nhiều đau, hổ phách. Gracias. –

+0

đã hoạt động như một huy hiệu .. – shazia