假设我有一个简单的模型来说明目的:

public class Category
{
    ...
    public IEnumerable<Product> Products { get; set; }
}

看法:

@model Category
...
<ul>
    @Html.EditorFor(m => m.Products)
</ul>

EditorTemplate:

@model Product
...
<li>
    @Html.EditorFor(m => m.Name)
</li>

请注意,我不必为IEnumerable<Product>定义EditorTemplate,而只能为Product模型创建它,并且MVC框架足够聪明,可以将其自己的模板用于IEnumerable。它遍历我的集合并调用我的EditorTemplate。

输出的HTML将是这样的

...
<li>
    <input id="Products_i_Name" name="Products[i].Name" type="text" value="SomeName">
</li>

毕竟我可以将其发布到我的 Controller 上。

但是,当我使用模板名称定义EditorTemplate时,为什么MVC不能做到这一点?

@Html.EditorFor(m => m.Products, "ProductTemplate")

在这种情况下,我必须将属性的类型更改为IList<Product>,自己遍历集合并调用EditorTemplate

@for (int i = 0; i < Model.Products.Count; i++)
{
    @Html.EditorFor(m => m.Products[i], "ProductTemplate")
}

对我来说这似乎是一种肮脏的解决方法。还有其他更清洁的解决方案吗?

最佳答案



简单的答案是“否”,这很糟糕,我完全同意您的观点,但这就是框架的设计者决定实现此功能的方式。

所以我要做的就是遵守约定。由于我对每个 View 和局部 View 都有特定的 View 模型,因此拥有相应的编辑器模板(与集合类型的命名方式相同)并不是什么大问题。

关于c# - 具有TemplateName的EditorFor IEnumerable <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14038392/

10-11 05:49