T4MVC不支持DisplayTemplates和EditorTemplates

时间:2011-02-02 01:03:29

标签: asp.net-mvc t4mvc editorfor viewusercontrol

当我在视图中使用以下内容时,我注意到了这一点:

<% Html.RenderPartial(MVC.Shared.Views.EditorTemplates.ClientOnDocuments); %>

上面的行只返回视图的名称,因此在这种情况下ClientOnDocuments。然后默认视图引擎启动并尝试在当前视图的文件夹和共享文件夹中查找ClientOnDocuments.ascx,但不在DisplayTemplatesEditorTemplates文件夹中查找。{/ p>

由于我使用T4MVC已经走得很远,我不想转储它或混合使用不同风格的引用视图(例如,如果我们提供模板的路径,上面的工作就可以了。)

原因在于T4MVC生成的代码:

    public class ViewNames {
    ...
        public readonly string FirmHeader = "~/Views/Shared/FirmHeader.ascx";
        public readonly string PostsSelector = "~/Views/Shared/PostsSelector.ascx";
        static readonly _DisplayTemplates s_DisplayTemplates = new _DisplayTemplates();
        public _DisplayTemplates DisplayTemplates { get { return s_DisplayTemplates; } }
        public partial class _DisplayTemplates{
            public readonly string ClientOnDocuments = "ClientOnDocuments";
            public readonly string DateTime = "DateTime";
        }
        static readonly _EditorTemplates s_EditorTemplates = new _EditorTemplates();
        public _EditorTemplates EditorTemplates { get { return s_EditorTemplates; } }
        public partial class _EditorTemplates{
            public readonly string ClientOnDocuments = "ClientOnDocuments";
            public readonly string DateTime = "DateTime";
            public readonly string PostCode = "PostCode";
        }

你可以看到,在共享根目录中包含的视图一切正常,但显然它不能很好地处理子文件夹。

我知道我可以更改T4MVC模板文件,但实际上想要David Ebbo对他是否要更改/更正此内容的回复。

希望他遵循SO,至少我在12月见过他。

1 个答案:

答案 0 :(得分:4)

有趣的是,在另一个用户遇到问题之后,这种不同的行为是故意投入的。在T4MVC.settings.t4中查找:

// Views in DisplayTemplates and EditorTemplates folders shouldn't be fully qualifed as it breaks
// the templated helper code
readonly string[]  NonQualifiedViewFolders = new string[] {
  "DisplayTemplates",
  "EditorTemplates"
};

通常情况下,子文件夹会获得完整路径,但只有这两个文件没有。

我认为不同之处在于,当您调用RenderPartial时,该用户正在调用DisplayFor / EditorFor来呈现这些内容。

在任何情况下,由于这是在设置文件而不是主模板中,如果您不想要这种行为,则可以简单地更改列表,即

readonly string[]  NonQualifiedViewFolders = new string[] { };

希望这有帮助! :)