asp.net MVC DisplayTemplates和EditorTemplate命名约定

时间:2010-02-23 09:38:04

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

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

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

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

  • 当我正在进行foreach( var c in Model.Accounts )时如何在foreach循环中调用显示器模板?当我在foreach Html.DisplayFor( x => x )x进行模型而不是c时。{/ p>

提前致谢。

5 个答案:

答案 0 :(得分: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>
<%}%>

希望有所帮助。 保罗

答案 1 :(得分:13)

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

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

然后您的模板名称将为“AccountList”。

答案 2 :(得分: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 

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

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

  • ModelMetadata的TemplateHint
  • ModelMetadata的DataTypeName
  • 类型的名称(见下面的注释)
  • 如果对象不复杂:“String”
  • 如果对象很复杂且界面:“对象”
  • 如果对象很复杂而不是接口:通过继承hiearchy递归该类型,尝试每个类型名称

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

答案 3 :(得分:1)

在设置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 for templates,我们需要在我们的模型项中添加以下行: [UIHint( “UserGuid”)]

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

答案 4 :(得分:-1)

在先前版本中不确定但在MVC5中您可以使用UIHint指定在模型中使用哪个自定义显示/编辑器模板,

[UIHint( “CustomAccountList”)] 公共列表账户{get;组; }

OR在视图中如此

Html.DisplayFor(model =&gt; model.Accounts,“CustomAccountList”)