2011-02-11 53 views
46

我目前正在使用帶有Razor的ASP.Net MVC3開發一個站點。在「查看/共享」文件夾中,我想添加一個名爲「Partials」的子文件夾,我可以放置所有部分視圖(爲了更好地組織網站)。將子目錄添加到ASP.Net MVC中的「查看/共享」文件夾並調用視圖

我可以做到這一點沒有問題長調用視圖(用剃刀)的時候,我總是引用「局部模板」文件夾:

@Html.Partial("Partials/{ViewName}") 

我的問題是,如果有一種方法來「局部模板」文件夾添加到列表中的。NET經過時搜索一個視圖,這樣我可以調用我的視圖,而不必參考「Partials」文件夾,如下所示:

@Html.Partial("{ViewName}") 

感謝您的幫助!

回答

62

解決了這個。要添加「共享/局部模板」子我創建的位置列表目錄中搜索嘗試使用定位在剃刀的局部視圖時:

@Html.Partial("{NameOfView}") 

首先創建RazorViewEngine視圖引擎作爲它的基類,並添加你的查看位置如下。同樣,我想將所有部分視圖存儲在由MVC創建的默認「Views/Shared」目錄中創建的「Partials」子目錄中。

public class RDDBViewEngine : RazorViewEngine 
{ 
    private static readonly string[] NewPartialViewFormats = 
    { 
     "~/Views/{1}/Partials/{0}.cshtml", 
     "~/Views/Shared/Partials/{0}.cshtml" 
    }; 

    public RDDBViewEngine() 
    { 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray(); 
    }  

} 

請注意,位置格式中的{1}是控制器名稱,{0}是視圖的名稱。

然後該視圖引擎添加到MVC ViewEngines.Engines收藏在Application_Start()方法在你的Global.asax:

ViewEngines.Engines.Add(new RDDBViewEngine()); 
+0

我想在我的項目中做同樣的事情。感謝您的明確解決方案。 – ses011 2011-05-11 03:07:33

+0

+1謝謝。這樣做很容易。並創建一個可重用的類的正確方法:) – ppumkin 2013-05-29 13:52:19

+0

你在哪裏添加你在第2步中創建的類「RDDBViewEngine」? – Zapnologica 2013-07-15 11:15:10

1

您可以創建註冊的任何視圖引擎的使用(Web表單/剃刀),從派生您自己的視圖引擎並指定在構造函數中想要的任何位置,或只是將它們添加到現有的位置列表:

this.PartialViewLocationFormats = viewLocations; 

然後在應用程序啓動,你會增加您的視圖引擎,像這樣: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

+0

您不需要繼承該類。 – SLaks 2011-02-11 19:25:44

26

謝謝您的解答。這已經組織了我的Shared文件夾,但爲什麼要創建一個新類型的視圖引擎?我剛剛製作了一個新的RazorViewEngine,將其設置爲PartialViewLocationFormats並將其添加到ViewEngines的列表中。

ViewEngines.Engines.Add(new RazorViewEngine 
{ 
    PartialViewLocationFormats = new string[] 
    { 
     "~/Views/{1}/Partials/{0}.cshtml", 
     "~/Views/Shared/Partials/{0}.cshtml" 
    } 
}); 
14

It's不錯的自定義視圖引擎,但如果你只是想有一個子文件夾POR泛音你鴕鳥政策需要這麼多......

只要用全路徑部分看來,作爲佈局視圖做:

@Html.Partial("/Views/Shared/Partial/myPartial.cshtml") 

希望它可以幫助別人......

5

您還可以更新註冊RazorViewEngine的partialview定位的格式。 將下面的代碼放在Global.asax的Application_Start中。

RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault(); 
     if (razorEngine != null) 
     { 
      string[] newPartialViewFormats = new[] { 
        "~/Views/{1}/Partials/{0}.cshtml", 
        "~/Views/Shared/Partials/{0}.cshtml" 
      }; 
      razorEngine.PartialViewLocationFormats = 
       razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray(); 
     } 
6

我已經更新lamarant的優秀的答案,包括地區:

public class RDDBViewEngine : RazorViewEngine 
{ 
    private static readonly string[] NewPartialViewFormats = 
    { 
     "~/Views/{1}/Partials/{0}.cshtml", 
     "~/Views/Shared/Partials/{0}.cshtml" 
    }; 

    private static List<string> AreaRegistrations; 

    public RDDBViewEngine() 
    { 
     AreaRegistrations = new List<string>(); 

     BuildAreaRegistrations(); 

     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray(); 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(areaRegistrations).ToArray(); 
    } 

    private static void BuildAreaRegistrations() 
    { 
     string[] areaNames = RouteTable.Routes.OfType<Route>() 
      .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area")) 
      .Select(r => r.DataTokens["area"].ToString()).ToArray(); 

     foreach (string areaName in areaNames) 
     { 
      AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml"); 
      AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml"); 
     } 
    } 
} 

然後別忘了在你的應用程序啓動,包括:

public class MvcApplication : System.Web.HttpApplication 
{ 

    protected void Application_Start() 
    { 
     ... 

     ViewEngines.Engines.Add(new RDDBViewEngine()); 
    } 
} 
1

如果你是在做這個ASP.NET Core,簡單地轉到Startup類,在ConfigureServices方法下,並把

services.AddMvc() 
    .AddRazorOptions(opt => { 
     opt.ViewLocationFormats.Add("/Views/{1}/Partials/{0}.cshtml"); 
     opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml"); 
    }); 
相關問題