Asp.net mvc RenderPartial如何找到视图的位置?
嗯。谷歌搜索可能会失败,我记得不久前读到过这方面的文章,但找不到 我在不同的目录中有一个视图和一个局部视图。在视图中,我说Asp.net mvc RenderPartial如何找到视图的位置?,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,嗯。谷歌搜索可能会失败,我记得不久前读到过这方面的文章,但找不到 我在不同的目录中有一个视图和一个局部视图。在视图中,我说@Html.RenderPartial(“[partial view name]”)RenderPartial如何确定要查看的位置?这一定是一个惯例,但它是什么 我的视图位于:WebRoot\Views\Admin\文件夹,分部位于WebRoot\Views\Admin\Partials 不确定这是否正确设置 我正在使用MVC 3(Razor引擎)查找视图是ViewEngin
@Html.RenderPartial(“[partial view name]”)代码>RenderPartial如何确定要查看的位置?这一定是一个惯例,但它是什么
我的视图位于:WebRoot\Views\Admin\
文件夹,分部位于WebRoot\Views\Admin\Partials
不确定这是否正确设置
我正在使用MVC 3(Razor引擎)查找视图是ViewEngine的责任。WebFormViewEngine最初是MVC1附带的,您可以看到它搜索的路径。请注意,它搜索视图和局部视图的相同路径
MVC 3(更确切地说是WebMatrix)引入的CshtmlViewEngine(Razor)搜索相似的位置,但查找不同的扩展名。应用程序中注册的每个视图引擎都有一个文件模式列表,当您使用简单名称引用视图时,将搜索这些文件模式(您也可以使用完整路径引用它,例如~\Views\Admin\View.aspx
)
在MVC 3中,指定要搜索的模式(这适用于Razor和WebForms视图引擎)。您可以,但必须注册路由,以告诉视图引擎在哪里查找。例如,在Global.asax.cs中,您将有:
ViewEngines.Engines.Add(new RDDBViewEngine());
课程是:
public class RDDBViewEngine : RazorViewEngine
{
private static string[] NewPartialViewFormats = new[] {
"~/Views/Shared/Partials/{0}.cshtml" ,
"~/Views/{0}.cshtml"
};
public RDDBViewEngine()
{
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
}
}
{0}用于所有带有partials的子文件夹。您可以更改现有RazorViewEngine的PartialViewLocationFormats属性,而不是子类化RazorView引擎(正如zdrsh所建议的那样)。此代码位于应用程序\u Start中:
System.Web.Mvc.RazorViewEngine rve = (RazorViewEngine)ViewEngines.Engines
.Where(e=>e.GetType()==typeof(RazorViewEngine))
.FirstOrDefault();
string[] additionalPartialViewLocations = new[] {
"~/Views/[YourCustomPathHere]"
};
if(rve!=null)
{
rve.PartialViewLocationFormats = rve.PartialViewLocationFormats
.Union( additionalPartialViewLocations )
.ToArray();
}
既然PartialViewLocationFormats=ViewLocationFormats,就没有办法将部分视图从视图中分离到不同的文件夹中?如果说这是一个包含我的部分的文件夹,这是一个包含我的视图的文件夹,那不是很好吗?在web表单中,我会有“控件”目录,并将我的用户.ascx控件放在那里。你可以将部分视图放在其中不同的文件夹,但随后需要使用不同的视图引擎。这实际上比听起来要简单得多。只需从MVC 3中的CshtmlViewEngine派生,并重写PartialViewLocationFormats属性以返回所需的搜索位置。请注意,搜索位置是格式字符串,其中包含控制器、操作等内容或区域已插入。您还需要以某种引导方法(例如应用程序启动)向MVC注册新的ViewEngine。这个问题似乎也与您的问题有关:我想知道ASP.NET团队为什么选择将部分与视图放在同一目录中。可能是因为它们可以通过扩展标识(.ascx表示部分内容,.aspx表示视图)。实际上,我很喜欢它,因为它允许您将所有相关内容放在一个文件夹中,从而更容易跟踪编辑内容的位置。也就是说,我自己的ViewEngine递归扫描整个views文件夹,以便在启动时查找位置,就像我喜欢将内容放在子文件夹中一样;)查看代码PartialViewLocationFormats=ViewLocationFormats;这是否意味着(默认情况下)我不能将我的局部视图与视图放在不同的文件夹中?