我需要修改脚手架的默认编辑器模板,但我还没找到Object.cshtml模板,在哪里可以找到默认的razor Object.cshtml编辑器模板?
答案 0 :(得分:8)
以下博客文章介绍了如何自定义编辑器模板:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html
基本上你必须添加一个名为Views\Shared\EditorTemplates\Object.cshtml
的文件,并将所有用于显示对象的逻辑放在那里。
答案 1 :(得分:6)
当@marcind说它们被编译时,模板本身不是嵌入式的,而是用代码编写的。例如,EditorFor
调用TemplateFor
,可以调用TextAreaExtensions.TextArea
或生成最终输出代码的许多其他扩展中的一个。这可能是因为我们可以选择删除默认视图引擎并使用nhaml之类的内容。
模板名称与创建结果输出的函数之间的映射可以在System.Web.Mvc.Html.TemplateHelpers
中看到。另请参阅System.Web.Mvc.Html.DefaultEditorTemplates
。
现在最接近的是Mvc3Futures中存在的Webforms模板,aspnet.codeplex.com website上提供了这些模板。其中包含一个包含模板的DefaultTemplates \ EditorTemplates文件夹。
这是Object.ascx模板:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<script runat="server">
bool ShouldShow(ModelMetadata metadata) {
return metadata.ShowForEdit
&& metadata.ModelType != typeof(System.Data.EntityState)
&& !metadata.IsComplexType
&& !ViewData.TemplateInfo.Visited(metadata);
}
</script>
<% if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
<% if (Model == null) { %>
<%= ViewData.ModelMetadata.NullDisplayText %>
<% } else { %>
<%= ViewData.ModelMetadata.SimpleDisplayText %>
<% } %>
<% } else { %>
<% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) { %>
<% if (prop.HideSurroundingHtml) { %>
<%= Html.Editor(prop.PropertyName) %>
<% } else { %>
<% if (!String.IsNullOrEmpty(Html.Label(prop.PropertyName).ToHtmlString())) { %>
<div class="editor-label"><%= Html.Label(prop.PropertyName) %></div>
<% } %>
<div class="editor-field"><%= Html.Editor(prop.PropertyName) %> <%= Html.ValidationMessage(prop.PropertyName, "*") %></div>
<% } %>
<% } %>
<% } %>