关于MVC 2中DisplayTemplates和EditorTemplates的命名约定,我有几个问题。
例如,如果我有一个带有子帐户列表的客户对象,我该怎么做:
为帐户列表创建显示模板,该文件名称是什么?
当我正在进行foreach( var c in Model.Accounts )
时如何在foreach循环中调用显示器模板?当我在foreach Html.DisplayFor( x => x )
内x
进行模型而不是c
时。{/ p>
提前致谢。
答案 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以获取编辑器模板的搜索路径。)
按顺序尝试以下模板名称:
我不确定你的第二个问题的答案。假设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”)