2

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

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

上面的行只返回视图的名称,所以在这种情况下ClientOnDocuments. 然后默认视图引擎启动并尝试ClientOnDocuments.ascx在当前视图的文件夹和 Shared 文件夹中查找,但不在DisplayTemplatesandEditorTemplates文件夹中查找。

由于我在使用 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 月在这里见过他。

4

1 回答 1

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"
};

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

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

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

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

希望这可以帮助!:)

于 2011-02-02T23:59:51.873 回答