2011-02-11 35 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"); 
    }); 
相关问题