asp.net MVC DisplayTemplates和EditorTemplate命名约定

lan*_*der 13 model-view-controller asp.net-mvc naming-conventions dynamic-data

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

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

  • 为帐户列表创建一个显示模板,该文件名为什么?

  • 当我在做一个foreach( var c in Model.Accounts )如何在foreach循环中调用显示器镜腿时?当我Html.DisplayFor( x => x )在foreach里面做的x是模型而不是在这种情况下c.

提前致谢.

Pau*_*aul 13

是的,这是我最喜欢的功能之一,但对某些事情来说有点混乱.

因此,为任何类创建模板,名称都基于类型的Name属性,例如,如果在视图中执行<%= model.GetType().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>
<%}%>
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.保罗


sir*_*ian 13

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

Html.DisplayFor(model => model.Account, "AccountList")
Run Code Online (Sandbox Code Playgroud)

那么模板的名称将是"AccountList".


Ale*_*ite 11

Brad Wilsons博客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 
Run Code Online (Sandbox Code Playgroud)

(将EditorTemplates替换为EditorTemplates以用于编辑器模板的搜索路径.)

按顺序尝试以下模板名称:

  • 来自ModelMetadata的TemplateHint
  • ModelMetadata中的DataTypeName
  • 类型的名称(见下面的注释)
  • 如果对象不复杂:"String"
  • 如果对象很复杂并且有一个接口:"对象"
  • 如果对象很复杂而不是接口:通过继承hiearchy递归类型,尝试每个类型名称

我不确定你的第二个问题的答案.假设var c实际上是有效的帐户c是正确的吗?当你写作的时候你Html.DisplayFor(x => x)也可以写作Html.DisplayModelFor(c => c)?或者你想要`Html.DisplayFor(x => x.AccountName)?