Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc RenderPartial如何找到视图的位置?_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

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;这是否意味着(默认情况下)我不能将我的局部视图与视图放在不同的文件夹中?