我开始使用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。
答案 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中,这样,它匹配视图引擎所期望的,并且部分将被纠正解决。