我开始使用 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 回答
在 MVC 中从不同区域调用局部视图或视图时,请指定局部视图或视图的完整路径。由于 MVC 基于约定,因此按照惯例,除非使用特定路径,否则视图(或控制器)中的调用代码将驻留在同一区域中,以用于引用的任何部分视图或视图。当它位于产品区域时,尝试使用完整路径引用局部视图:
由于引用的视图是共享视图,因此如果您在同一区域中指定完整路径则无关紧要。但是,如果您尝试访问的视图位于与尝试引用它的视图不同的目录中,并且此目录未命名为 shared,则无论区域如何,都需要指定完整路径。控制器调用视图时类似;如果来自与引用视图相同区域的控制器指定视图的短名称,并且此视图来自名称与其自身不同的父目录(忽略“控制器”后缀),则视图引擎将找不到您的视图。除非视图的父目录位于共享文件夹中。
无论是在控制器还是视图中,您都无法跨区域使用“短名称”,因为视图引擎具有在不使用路径时查看位置的约定。区域是为了保持代码分离,或者如果你愿意,在默认情况下以高级别分离。因此,任何“越过障碍”的决定都应该谨慎考虑,但肯定不会气馁。这都是关于惯例的。
我现在正在回答我自己的问题..我的页面查看路径不正确。由于我的区域是 Products,控制器是 ProductController,我的页面视图应该放在~\ Areas\Products\Views\Product\EditPage.cshtml 中,这样,它匹配视图引擎所期望的,并且部分将被纠正解决。