【问题标题】:asp.net MVC DisplayTemplates and EditorTemplate naming conventionasp.net MVC DisplayTemplates 和 EditorTemplate 命名约定
【发布时间】:2011-01-19 23:55:07
【问题描述】:

关于 MVC 2 中的 DisplayTemplates 和 EditorTemplates 的命名约定,我有几个问题。

例如,如果我有一个带有子帐户列表的客户对象,我该怎么做:

  • 为账户列表创建一个显示模板,文件叫什么?

  • 当我在执行 foreach( var c in Model.Accounts ) 时,如何在 foreach 循环中调用显示寺庙?当我在 foreach 中执行 Html.DisplayFor( x => x ) 时,x 是模型,在这种情况下不是 c

提前致谢。

【问题讨论】:

    标签: asp.net-mvc model-view-controller naming-conventions dynamic-data


    【解决方案1】:

    Brad Wilsons blog http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html 有一个关于自定义对象的 DisplayTemplates 和 EditorTemplates 的示例,其中讨论了可能有助于解决您的问题的问题。

    关于您的第一个问题,重要您的模板位于系统在其中查找匹配名称的文件夹中,例如

     ~/Views/ControllerName/DisplayTemplates/TemplateName.aspx & .ascx
     ~/Views/Shared/DisplayTemplates/TemplateName.aspx & .ascx 
    

    (将 DisplayTemplates 替换为 EditorTemplates 以获得编辑器模板的搜索路径。)

    依次尝试以下模板名称:

    • 来自 ModelMetadata 的模板提示
    • 来自 ModelMetadata 的 DataTypeName
    • 类型的名称(见下面的注释)
    • 如果对象不复杂:“字符串”
    • 如果对象是复杂的和接口:“对象”
    • 如果对象很复杂而不是接口:递归遍历类型的继承层次结构,尝试每个类型名称

    我不确定您的第二个问题的答案。假设 var c 实际上是有效的帐户 c 是否正确?当你写 Html.DisplayFor(x => x) 时,你还不如写 Html.DisplayModelFor(c => c) ?或者您是否想要 `Html.DisplayFor(x => x.AccountName),例如?

    【讨论】:

    • 您好,感谢您提供的链接,但它并不能完全回答我的所有问题。例如,假设我有一个带有子订单列表的客户。目前,如果我想显示订单列表,我已经创建了 IEnumberable 的部分视图,并围绕每个对象循环创建了一个表。如果我想使用它,我会说一些链接 Html.RenderPartial("OrdersTable",Model.Orders) 但我不想使用它,而是说 Html.DisplayFor(x => x.Orders) 并找到一个显示模板但我不知道如何调用列表的显示模板。
    • 我一直在用头撞这个。我没有意识到搜索路径很重要。将编辑您的帖子以明确这一点。
    【解决方案2】:

    是的,这是我最喜欢的功能之一,但对于某些事情来说有点令人困惑。

    因此,为任何类创建模板,名称基于类型的 Name 属性,例如,如果您在视图中执行 ,您可以看到我意思是。例如,如果您的帐户列表是 IList,则对该类型的 .Name 调用将返回 List`1。这是一个合法的文件名,所以如果你把List`1.ascx 放在你的DisplayTemplates 文件夹中,它会找到并使用它。据我所知,它不会遍历类层次结构,例如,如果您将 IEnumerable`1.ascx 文件放在那里,它将找不到它。

    要在循环中显示,您需要将 item 变量传递给 lambda,因此在您的示例中:

    <% foreach (var c in Accounts){ %>
          <li><%= Html.DisplayFor(x => c) %></li>
    <%}%>
    

    希望对您有所帮助。 保罗

    【讨论】:

    • 感谢您的回答非常棒。另一个问题,如果我有两个具有不同子列表的单独对象,例如帐户和人员都将具有对象名称 List`1,您如何区分两者?还是必须使用 UIHint 属性?
    • 是的,两者都一样。我认为 UIHint 会起作用(还没有尝试过),但你也可以做的是让列表模板是通用的(比如,基于 IEnumerable,非通用),然后让它在 its内调用 DisplayFor > 列表,然后列表项将有各自正确键入的模板。 iirc,您还可以在其中一个重载中将显式模板名称作为字符串传递。
    • (已编辑以修复 Markdown 语法中的文字反引号。)
    • This answer is out of date 请查看其他答案或更新此答案以包含新方法(更简单,更简洁)!谢谢
    【解决方案3】:

    我意识到这个问题有点老了,但至少在 MVC 3 中,当你想使用一个列表来自定义显示/编辑模板时,你可以传入模板的名称:

    Html.DisplayFor(model => model.Account, "AccountList")
    

    那么您的模板名称将是“AccountList”。

    【讨论】:

    • 比公认的答案要好得多。显然,在回答时它是相关的,但 SO 的重点是更新旧答案或支持像你这样的新答案。谢谢。
    【解决方案4】:

    在设置 MVC 3 应用程序时,应该允许下拉列表选择项目的外键不会呈现为下拉列表,而是呈现为静态输入。这可以通过为该字段创建自定义显示和视图来解决。 我们需要首先创建一个自定义局部视图,该视图将位于“~/Views/Shared/DisplayTemplates/UserGuid.cshtml”和“~/Views/Shared/EditTemplates/UserGuid.cshtml”中。一个的代码位于下面:

    @model Guid
    
    @{ 
        incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB();
        incMvcSite.Models.SecUser usr = db.SecUsers.Single(u => u.Guid == Model);
    }
    @usr.Display
    

    这是一个模板显示,它将查找引用表中的项目并显示它。我们还需要对模板进行如下编辑:

    @model Guid
    @{ 
        incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB();
        SelectList items = new SelectList(db.SecUsers.OrderBy(i => i.Display).ToList(), "Guid", "Display", Model);
    }
    @Html.DropDownList("", items)
    

    模板的编辑被实现为一个下拉列表。最初,我们使用的是静态 HTML 代码,但会出现实现“前缀”的问题。静态 HTML 代码确实由 HTML 助手处理,因此建议您使用 HTML.DropDownList()。 要强制 MVC 框架对模板使用新的 Display 和 Edit,我们需要注释我们的模型项并添加以下行: [UIHint("UserGuid")]

    这将导致 MVC 使用名为“UserGuid”的显示和编辑模板,它们只是部分视图。

    【讨论】:

      【解决方案5】:

      在以前的版本中不确定,但在 MVC5 中,您可以使用 UIHint 来指定要在模型中使用的自定义显示/编辑器模板,就像这样,

      [UIHint("CustomAccountList")] 公共列表帐户{获取;放; }

      在视图中像这样

      Html.DisplayFor(model => model.Accounts, "CustomAccountList")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        相关资源
        最近更新 更多