【问题标题】:Problem with MVC EditorFor named templateMVC EditorFor 命名模板的问题
【发布时间】:2011-08-14 16:06:38
【问题描述】:

我有一个看起来(无论如何对我来说)是一个奇怪的问题......

我为一个 SelectListItem 创建了一个简单的编辑器模板(在 ~/Views/Shared/EditorTemplates 文件夹中的 SelectListItem.cshtml),例如:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories)
</ul>

其中 c.Categories 是一个 IEnumerable

这很好用,但我想要另一个模板来呈现带有略微不同标记的集合,因此我复制并重命名了编辑器模板,例如,“CategoryIcons.cshtm”并调用如下:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories, "CategoryIcons")
</ul>

简而言之,唯一的区别是我指定了一个命名的编辑器模板。

当我打开页面时,我现在收到以下错误:

传入字典的模型项的类型为“System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]”,但此字典需要类型为“System.Web.Mvc”的模型项。选择列表项'

模板的模型声明,在两个模板id中:

@model System.Web.Mvc.SelectListItem

我不明白为什么默认模板有效而命名模板无效。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 razor editortemplates


    【解决方案1】:

    当您调用@Html.EditorFor(c =&gt; c.Categories) 时,它会退回到 IEnumerable 的默认模板。此默认模板由 MVC 框架提供,其行为是为枚举中的每一项输出Html.EditorFor()。这反过来为列表中的每个项目单独发出适当的编辑器模板 - 在您的情况下,它们都是SelectListItem 的实例,因此在第一种情况下,每个项目都使用SelectListItem 模板。

    在第二种情况下,通过显式设置您的 EditorFor 以使用特定的编辑器模板 CategoryIcons,您是在告诉它为 整个枚举 使用该编辑器模板,而不是允许默认情况下可枚举为模板化,依次为每个枚举项使用模板。

    我还不确定解决这个问题的最佳方法。

    一种方法是定义一个CategoryIcons 模板,其模型是IEnumerable&lt;CategoryIcon&gt; 的一个实例,它简单地获取Model 枚举,并为每个项目执行Html.EditorFor,并使用@ 的显式模板引用987654331@。然后,您将每个项目的编辑器模板放入该模板(CategoryIcon 而不是CategoryIcons)。然后,您可以通过 @Html.EditorFor(c =&gt; c.Categories, "CategoryIcons") 调用它。

    我将环顾四周,看看是否有更好的方法来完成这项工作,但我希望这对现在有用。如果模板可以被参数化,那就太好了,因此您可以编写一个 IEnumerable 模板,该模板将模板的名称作为参数用于每个项目。

    【讨论】:

    • 我写的是完全相同的响应,我唯一要补充的是,您可以用任何其他名称的类包装 SelectListItem 并使用它来获取不同的模板,但在任一情况下,这可能是希望添加到 MVCContrib 的人开始的好地方。
    • 感谢您的解释和建议。我通过从 SelectListItem 继承创建了一个新类,然后为该类创建了一个新模板 - 它运行良好,但似乎确实是不必要的开销。
    【解决方案2】:

    只是一个更新,我偶然发现了这个问题,试图自己解决同样的问题。

    我最终做的是遍历集合的每个实例并单独调用 EdtorFor,有点像这样:

    <ul class="select-list-item cell-15 col-3 omega clearfix">
        @for (int i=0;i<Model.Categories.Count;i++) {
            @Html.EditorFor(c => c.Categories[i], "CategoryIcons")
        }
    </ul>
    

    仍然不干净,但我更喜欢它而不是像你最终那样继承一个新类。

    (对不起,如果我的 C# 语法有点不对,我在 vb.net 中编写)

    【讨论】:

    • 谢谢 Ben,我认为这个解决方案要容易得多 - 特别是如果您只处理模型的一个实例。这对我来说不是这样,我觉得在我的特定应用程序中创建一个新类实际上允许我向数据添加一些额外的方法和属性。我猜是“当然的马”案例 - 谢谢你的帖子 - 非常感谢。
    【解决方案3】:

    如果您使用的是 EditorFor,我认为循环解决方案不会起作用。似乎使用 IEnumerable 模板是正确命名表单输入的唯一方法;如果您只是反复调用 EditorFor,那么您的表单 &lt;INPUT&gt;s 将具有相同的 ID,而不是索引 ID。

    我遇到了这个问题,solution 是发出可枚举的模板,而 not 循环遍历列表项。

    很抱歉将此作为答案而不是评论 - 没有评论权。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      相关资源
      最近更新 更多