嵌套列表模型绑定和HTML帮助程序

时间:2014-12-05 17:31:57

标签: c# asp.net asp.net-mvc asp.net-mvc-2

我正在尝试在ASP.NET MVC 2中创建一个复选框列表的编辑器。这些复选框的集合基于数据库表。我无法正确地将名称输出,以便值发布...

的ViewModels:

public class EAF
{
    // other properties
    public IEnumerable<ProductViewModel> _products { get; set; }
}

public class ProductViewModel
{
    public int ProductPK { get; set; }
    public string ProductName { get; set; }
    public bool IsSelected { get; set; }
}

主要观点:

<%: Html.EditorFor(m => m._products, "ProductListTemplate") %>

编辑模板(列表):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<EmployeeAccessForm.Models.ProductViewModel>>" %>

<fieldset>
<legend>REQUEST FOR:  (select item(s) to display access form)</legend>
<table>
    <tr>
<% for (int i = 0; i < Model.Count(); i++) { %>
    <td>
    <%: Html.EditorFor(model => model[i], "ProductCheckBox") %>
    </td>
    <% if (i+1 % 5 == 0) { %>
        </tr>
        <tr>
    <% } %>
<% } %>
    </tr>
</table>
</fieldset>

编辑模板(项目):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<EmployeeAccessForm.Models.ProductViewModel>" %>

<%: Html.HiddenFor(model => model.ProductPK)%>
<%: Html.CheckBoxFor(model => model.IsSelected)%>
<%: Html.DisplayTextFor(model => model.ProductName)%>

我按预期得到了一个复选框表,但是当我查看源代码时,输​​入都有_products.[0].ProductPK这样的名称,我需要它_products[0].ProductPK(没有第一个点)。有没有办法使用助手让名字像后者一样出来?我可以通过明确写出HTML来做到这一点但想知道我是否仍然可以使用帮助程序并获得正确的命名。

1 个答案:

答案 0 :(得分:1)

问题来自于使用列表的编辑器模板。即使你没有发布它,我假设在你的主视图中你有类似的东西:

<%: Html.EditorFor(m => m._products, "ProductListTemplate") %>

这会导致添加前缀_products。然后在列表模板中,字段名称以[0].ProductPK的形式绑定。结果是_products.[0].ProductPK

相反,在您的主视图中,您应该这样做:

<fieldset>
<legend>REQUEST FOR:  (select item(s) to display access form)</legend>
<table>
    <tr>
<% for (int i = 0; i < Model.Count(); i++) { %>
    <td>
    <%: Html.EditorFor(model => model._products[i], "ProductCheckBox") %>
    </td>
    <% if (i+1 % 5 == 0) { %>
        </tr>
        <tr>
    <% } %>
<% } %>
    </tr>
</table>
</fieldset>

换句话说,删除那个搞砸了字段名称的中间层。由于表达式在model._products[i]处传递,因此您的字段名称将以_products[0]为前缀。

如果您使用列表模板的目标只是重用视图的这一部分,您仍然可以这样做,但您传入的模型应该是您的EAF类,然后您将使用{{1而不是Html.Partial

Html.EditorFor

<强> ProductListTemplate.cshtml

<%: Html.Partial("ProductListTemplate") %>