在EditorTemplates文件夹区域中查找Razor部分视图

时间:2014-08-08 21:55:08

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

我开始使用EditorFor辅助方法来渲染我的剃刀部分视图,但是我无法使Regions文件夹中的部分工作。

以下是部分路径: ~\Areas\Products\Views\Shared\EditorTemplates\_Edit.cshtml

部分非常简单,只有一个" div"标签进行测试。

尝试在我的页面视图(〜\ Areas \ Products \ Views \ EditPage.cshtml)中使用 @Html.EditorFor(m => m.ProductEditModel, "_Edit")

Visual Studio告诉我"无法解析模板' _Edit'"。

现在,如果我将partial移动到根视图文件夹: ~\Views\Shared\EditorTemplates\_Edit.cshtml

它有效,Visual Studio解决模板没有问题,div在我的浏览器中正确呈现。

我也试图自定义RazorViewEngine,但无法正常工作

namespace MySite.Web
{
    public class RazorViewEngine : System.Web.Mvc.RazorViewEngine
    {
        public RazorViewEngine()
            : this(null)
        {
        }

        public RazorViewEngine(IViewPageActivator viewPageActivator)
            : base(viewPageActivator)
        {
            AreaPartialViewLocationFormats = new[]
                                         {
                                             "~/Areas/{2}/Views/Shared/EditorTemplates/{0}.cshtml"
                                         }.Union(AreaPartialViewLocationFormats).ToArray();
        }
    }
}

只是想知道我做错了什么?顺便说一下,我目前正在使用MVC3,由于一些旧的组件,无法升级到MVC4。

2 个答案:

答案 0 :(得分:1)

在MVC中从其他区域调用局部视图或视图时,请指定局部视图或视图的完整路径。由于MVC基于约定,因此按照惯例,除非使用特定路径,否则视图(或控制器)中的调用代码将驻留在同一区域中,以用于引用的任何部分视图或视图。当它位于产品区域时,尝试使用完整路径引用局部视图:

@Html.EditorFor(m => m.ProductEditModel, "~/Areas/Products/Views/Shared/EditorTemplates/_Edit.cshtml")

由于引用的视图是共享视图,如果您在同一区域中指定完整路径,则无关紧要。但是,如果您尝试访问的视图位于与尝试引用它的视图不同的目录中,并且此目录未命名为shared,则无论区域如何,都需要指定完整路径。控制器调用视图时类似;如果来自与引用视图相同区域的控制器指定视图的短名称,并且此视图来自名称与其自身不同的父目录(忽略“控制器”后缀),则视图引擎将找不到您的视图。除非视图的父目录位于共享文件夹中。

无论是在控制器还是视图中,您都无法跨区域使用“短名称”,因为视图引擎具有在不使用路径时查看位置的约定。区域是为了保持代码分离,或者如果你愿意,在默认情况下以高级别分离。因此,任何“越过障碍”的决定都应该谨慎考虑,但肯定不会气馁。这都是关于惯例的。

答案 1 :(得分:0)

我现在正在回答我自己的问题。我的页面查看路径不正确。由于我的区域是Products,控制器是ProductController,我的页面视图应该放在〜\ Areas \ Products \ Views \ Product \ EditPage.cshtml中,这样,它匹配视图引擎所期望的,并且部分将被纠正解决。