Estoy intentando enlazar una lista que es parte de un modelo de vista más grande sin recurrir a un archivador de modelo personalizado. Cuando uso una plantilla de editor para compilar la lista de entradas, los nombres generados no están en el formato correcto para que funcione la carpeta predeterminada.ASP.NET MVC Model Binding IList en una plantilla de editor
en lugar de artículos [3] .Id como lo esperaría es artículos. [3] .Id. Si construyo la lista sin una plantilla de editor, funciona como se esperaba.
¿Estoy haciendo algo obviamente incorrecto o es esto solo una peculiaridad de Html.Hidden y 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>
<%
}%>
salida
<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>
Editar (Método Acción)
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 } }
}
});
}
Edición # 2
HttpPost Acción
[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>
lo que es realmente una peculiaridad en la forma MVC genera los nombres de campo. La vista parcial no tiene en cuenta que el modelo es una colección al generar el nombre del campo. Supongo que si los artículos.se crea en el nivel de vista en lugar del nivel de vista parcial, entonces puede que no haya una buena manera de solucionarlo. Gracias. –
kondotine: suena como un error de asp.net mvc, ¿alguien lo ha informado? – Wout
Ok, informé de mí mismo: http://aspnet.codeplex.com/workitem/7711, ¡vote por esta corrección de errores! – Wout