首页 文章

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

提问于
浏览
1

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

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

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

尝试在我的页面视图(~ AreasProductsViewsEditPage.cshtml)中使用@Html.EditorFor(m => m.ProductEditModel, "_Edit")

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

现在,如果我将部分移动到根视图文件夹:~\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 回答

  • 1

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

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

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

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

  • 0

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

相关问题