我在哪里可以找到默认的Object.cshtml编辑器模板?

时间:2011-02-11 17:18:03

标签: asp.net-mvc-3 razor scaffolding

我需要修改脚手架的默认编辑器模板,但我还没找到Object.cshtml模板,在哪里可以找到默认的razor Object.cshtml编辑器模板?

2 个答案:

答案 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>
        <% } %>
    <% } %>
<% } %>