C# ASP.NET mvc4-ICollection循环内的表单元素

C# ASP.NET mvc4-ICollection循环内的表单元素,c#,asp.net-mvc-4,razor,C#,Asp.net Mvc 4,Razor,我想制作一个编辑功能,在其中可以将metafields=类别的特定字段添加到类别中 我想在视图中做的是 foreach (App.Models.Metafield field in Model.Category.Metafields) { <div class="field"> @Html.TextBoxFor(model => field.Name, new { @class = "form-control title" }) @Html

我想制作一个编辑功能,在其中可以将metafields=类别的特定字段添加到类别中

我想在视图中做的是

foreach (App.Models.Metafield field in Model.Category.Metafields)
{
   <div class="field">
        @Html.TextBoxFor(model => field.Name, new { @class = "form-control title" })
        @Html.DropDownListFor(model => field.Type, Model.MetaTypes, new { @class = "form-control type" })
   </div>
}

问题是当我点击save按钮时,元字段没有添加到viewModel中。所以我猜field.Name和field.Type应该被其他内容替换

这不能以这种方式工作,因为发送的表单不能包含这些具有相同名称的动态生成字段

但是,您可以使用js从这些动态字段收集数据,并在提交表单之前将其序列化为隐藏字段,然后在服务器端对其进行解析。 以下是jquery的一个示例:

$('#save-btn').click(function(e) {
    $hidden = $("#hidden");
    $hidden.val(getDynamicData());
});

function getDyanmicData() {
    var data;
    $fields = $(".field");
    // get children and calculate data

    return data;
}
这可能有点太“手工工作”,但我发现知道发生了什么很有用。对于其他解决方案,您可以在ASP.NET MVC中搜索表单动态表单。

请尝试此代码

@for(int i=0;i<=Model.Category.Metafields.count();i++)
{
   <div class="field">
        @Html.TextBoxFor(m=> m[i].Name, new { @class = "form-control title" })
        @Html.DropDownListFor(m=> m[i].Type, Model.MetaTypes, new { @class = "form-control type" })
   </div>
}

是否在linq查询中添加了include语句?为了告诉实体框架加载类别和加载元字段