Tôi đang cố gắng ràng buộc một danh sách là một phần của mô hình chế độ xem lớn hơn mà không cần sử dụng một trình kết nối mô hình tùy chỉnh. Khi tôi sử dụng mẫu trình chỉnh sửa để tạo danh sách các yếu tố đầu vào, tên được tạo không ở định dạng chính xác cho trình kết nối mặc định hoạt động.Liên kết mô hình MVC ASP.NET IList trong Mẫu biên tập
Thay vì các mục [3] .Id như tôi mong đợi nó là Mục. [3] .Id. Nếu tôi xây dựng danh sách mà không có mẫu trình soạn thảo, nó hoạt động như mong đợi.
Tôi có đang làm điều gì đó hiển nhiên không đúng hay đây chỉ là một dấu nháy đơn của Html.Hidden và Html.TextBox?
public class ItemWrapper
{
[UIHint("ItemList")]
public IList<Item> Items { get; set; }
}
public class Item
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Value { get; set; }
}
index.aspx
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Index</h2>
<% using(Html.BeginForm())
{%>
<%:Html.EditorFor(m => m.Items) %>
<%}%>
</asp:Content>
ItemList.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<Mvc2Test.Models.Item>>" %>
<h4>Asset Class Allocation</h4>
<% if(Model.Count > 0) { %>
<table>
<tbody>
<% for(int i = 0; i < Model.Count; i++)
{%>
<tr>
<td><%: Model[i].Name%></td>
<td>
<%: Html.HiddenFor(m => m[i].Id) %>
<%: Html.TextBoxFor(m => m[i].Value) %>
</td>
</tr>
<%}%>
</tbody>
</table>
<%
}%>
Output
<tr>
<td>Item 4</td>
<td>
<input id="Items__3__Id" name="Items.[3].Id" type="hidden" value="f52a1f57-fca8-4bc5-a746-ee0cef4e05c2" />
<input id="Items__3__Value" name="Items.[3].Value" type="text" value="40" />
</td>
</tr>
Sửa (Action Method)
public ActionResult Test()
{
return View(
new ItemWrapper
{
Items = new List<Item>
{
{ new Item { Id = Guid.NewGuid(), Name = "Item 1", Value = 10 } },
{ new Item { Id = Guid.NewGuid(), Name = "Item 2", Value = 20 } },
{ new Item { Id = Guid.NewGuid(), Name = "Item 3", Value = 30 } },
{ new Item { Id = Guid.NewGuid(), Name = "Item 4", Value = 40 } }
}
});
}
Chỉnh sửa # 2
HttpPost Action
[HttpPost]
public ActionResult Test(ItemWrapper w)
{
if(w.Items == null)
Response.Write("Items was null");
else
Response.Write("Items found " + w.Items.Count.ToString());
return null;
}
index.aspx
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h4>Does Not Work</h4>
<% using(Html.BeginForm("Test", "Home"))
{%>
<%:Html.EditorFor(m => m.Items) %>
<input type="submit" value-"Go" />
<%}%>
<h4>Does Work</h4>
<% using(Html.BeginForm("Test", "Home"))
{%>
<table>
<tbody>
<% for(int i = 0; i < Model.Items.Count; i++)
{%>
<tr>
<td><%: Model.Items[i].Name%></td>
<td>
<%: Html.HiddenFor(m => Model.Items[i].Id) %>
<%: Html.TextBoxFor(m => Model.Items[i].Value) %>
</td>
</tr>
<%}%>
</tbody>
</table>
<input type="submit" value-"Go" />
<%}%>
</asp:Content>
Vì vậy, nó thực sự là một điều không minh bạch trong cách MVC tạo ra các tên trường. Chế độ xem một phần không tính đến mô hình đó là một bộ sưu tập khi tạo tên trường. Tôi đoán nếu các mục.được tạo ở cấp chế độ xem thay vì cấp chế độ xem một phần thì có thể không có cách nào tốt để khắc phục nó. Cảm ơn. –
kondotine: âm thanh như một lỗi mvc asp.net, có ai chưa báo cáo không? – Wout
Ok, đã tự báo cáo: http://aspnet.codeplex.com/workitem/7711, vui lòng bỏ phiếu cho sửa lỗi này! – Wout