2011-10-03 52 views
4

好的。谷歌搜索可能失败,我记得有一段时间阅读了这个,但无法找到它。RenderPartial如何找出在哪里可以找到视图?

我在不同的目录中有一个视图和一个局部视图。在一个视图中,我说@Html.RenderPartial("[partial view name]"); RenderPartial如何找出在哪里看?它必须是一个惯例,但它是什么?

我的看法是:WebRoot\Views\Admin\文件夹和部分在WebRoot\Views\Admin\Partials

不知道这是否正确的设置。

我使用MVC 3(剃刀引擎)

回答

3

你可以,但你必须注册路线,告诉视图引擎在哪里寻找。例如,在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}是所有与谐音的子文件夹。

3

定位的看法是视图引擎的责任。 WebFormViewEngine是MVC 1最初提供的一个,您可以看到它搜索的路径on codeplex。请注意,它会在相同路径中查看视图和部分视图。

与MVC 3(或更确切地说WebMatrix)一起引入的CshtmlViewEngine(Razor)搜索类似的位置,但寻找不同的扩展名。

+0

因此,由于PartialViewLocationFormats = ViewLocationFormats;没有办法将部分视图与视图分离到不同的文件夹中?这不是很好,说这里是我的部分文件夹,这里是我的意见的文件夹。在网页表单中我会有'控制'目录,我会把我的用户.ascx控件放在那里。 –

+0

我正在使用MVC 3(剃刀)btw –

+0

您可以将部分视图放在不同的文件夹中,但需要使用不同的ViewEngine。这实际上比听起来简单得多。只需从MVC 3中的CshtmlViewEngine派生并覆盖PartialViewLocationFormats属性以返回所需的搜索位置。请注意,搜索位置是格式字符串,其中插入了控制器,操作或区域等内容。您还需要在一些引导方法(例如Application_Start)中使用MVC注册新的ViewEngine。 –

1

在应用程序中注册的每个视图引擎有当您参考使用一个简单的名称一种观点认为,将搜索到的文件模式列表

(你也可以使用完整路径如~\Views\Admin\View.aspx引用它)在MVC 3 properties of the view engine指定要搜索的模式(这适用于Razor和WebForms视图引擎)。

+0

查看代码http://aspnet.codeplex.com/SourceControl/changeset/view/70574 #266536 PartialViewLocationFormats = ViewLocationFormats;那么这是否意味着我不能(默认情况下)将视图中的部分视图放在不同的文件夹中? –

1

您可以改变现有的RazorViewEngine的PartialViewLocationFormats属性,而不是继承RazorView引擎的子类(如zdrsh所建议的)。此代码进入Application_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(); 
}