使用编辑器模板动态添加新字段

时间:2012-07-20 09:42:48

标签: asp.net-mvc-4 mvc-editor-templates

在我的MVC4项目中,我有一个带有Product视图模型集合的Category视图模型。我使用编辑器模板渲染单个产品视图模型,并将Product视图模型的集合传递给它:

类别视图模型:

@model CategoryViewModel
@using MVC4PartialViews.Models.ViewModels

<div class="editor-field">
    @Html.EditorFor(model => model.CategoryName)
    @Html.ValidationMessageFor(model => model.CategoryName)
</div>

@Html.EditorFor(x => x.Products)

在集合中呈现每个产品的编辑器模板:

<div class="editor-field">
    @Html.EditorFor(model => model.ProductName)
    @Html.ValidationMessageFor(model => model.ProductName)
</div>
// etc.

这非常有效,因为它可以正确地自动命名和索引元素,因此所有产品都会作为父类别视图模型的一部分回发 - 这是它输出的内容:

<div class="editor-field">
    <input class="text-box single-line" id="Products_0__ProductName" name="Products[0].ProductName" type="text" value="Add 1st product for this Category" />
    <span class="field-validation-valid" data-valmsg-for="Products[0].ProductName" data-valmsg-replace="true"></span> 
</div>

我需要让用户添加和删除产品。要添加一个新的,我需要动态呈现编辑器模板来创建新产品并让每个字段正确索引/命名,即如果我已经有2个产品(索引0和1)那么新产品需要命名为这样:

Products[2].ProductName

我已经读过史蒂夫·桑德森的这篇文章,但看起来很笨重,他用Guid而不是连续的索引字段索引他的字段:

Editing a variable length list in MVC2

TIA

2 个答案:

答案 0 :(得分:0)

在这里回答不迟,

我正在寻找您提供给我的链接有用的东西。现在我知道如何使用IEnumerable中模型的EditorFor属性中的添加/删除项来动态添加上传文件输入。

对于您的解决方案,我认为UIHint and template可以做您想做的任何事情。在模板内,您可以foreach并指定id的格式。

答案 1 :(得分:0)

查看Jarrett Meyer博客文章Nested Collection Models in MVC3中列出的解决方案 在this answer上总结了SO。