2011-10-03 30 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(); 
}