mvc6:为 viewComponents 的视图指定自定义位置
mvc6: specify custom location for views of viewComponents
默认情况下,mvc6 在 /Views/ControllerUsingVc/Components
或 /views/shared
文件夹中搜索 ViewComponents 的视图。
是否可以添加一个自定义位置来寻找它们?例如。 /views/mySharedComponents
您可以这样做,但您必须执行以下步骤。
基于 RazorViewEngine 创建新的视图引擎。同样默认情况下它需要 Components 目录,所以只需使用 Views 作为根文件夹。
namespace WebApplication10
{
public class MyViewEngine : RazorViewEngine
{
public MyViewEngine(IRazorPageFactory pageFactory, IViewLocationExpanderProvider viewLocationExpanderProvider, IViewLocationCache viewLocationCache) : base(pageFactory,viewLocationExpanderProvider,viewLocationCache)
{
}
public override IEnumerable<string> ViewLocationFormats
{
get
{
List<string> existing = base.ViewLocationFormats.ToList();
existing.Add("/Views/{0}.cshtml");
return existing;
}
}
}
}
在MVC中添加ViewEngine Startup.cs
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ViewEngines.Add(Type.GetType("WebApplication10.MyViewEngine"));
});
现在我已将我的组件放置在以下位置。例如我的组件名称是 MyFirst.cshtml。所以我可以放置 Views/Components/MyFirst/Default.cshtml.
基本上您可以通过创建自定义视图引擎或创建自定义视图引擎来做到这一点 IViewLocationExpander
但是对于 beta-6 中的视图组件,总是会添加 "Components" 前缀。查看 ViewViewComponentResult 源代码。这很可悲。
好消息,您可以通过复制上面的代码并仅替换用于视图搜索的格式字符串来创建自己的视图组件结果。
我知道这是一个老问题,但它可以做得更简单...
services.Configure<RazorViewEngineOptions>(o =>
{
o.ViewLocationFormats.Add("/views/{0}.cshtml");
});
您还可以为 .NET Core
执行以下操作
services
.AddMvc(options =>
{
...
})
.AddRazorOptions(o =>
{
o.AreaViewLocationFormats.Add("Areas/{2}/Views/SUBFOLDER/{1}/{0}.cshtml");
o.ViewLocationFormats.Add("Views/SUBFOLDER/{1}/{0}.cshtml");
})
显然根据您是否使用区域选择 AreaViewLocationFormats
或 ViewLocationFormats
。
默认情况下,mvc6 在 /Views/ControllerUsingVc/Components
或 /views/shared
文件夹中搜索 ViewComponents 的视图。
是否可以添加一个自定义位置来寻找它们?例如。 /views/mySharedComponents
您可以这样做,但您必须执行以下步骤。
基于 RazorViewEngine 创建新的视图引擎。同样默认情况下它需要 Components 目录,所以只需使用 Views 作为根文件夹。
namespace WebApplication10 { public class MyViewEngine : RazorViewEngine { public MyViewEngine(IRazorPageFactory pageFactory, IViewLocationExpanderProvider viewLocationExpanderProvider, IViewLocationCache viewLocationCache) : base(pageFactory,viewLocationExpanderProvider,viewLocationCache) { } public override IEnumerable<string> ViewLocationFormats { get { List<string> existing = base.ViewLocationFormats.ToList(); existing.Add("/Views/{0}.cshtml"); return existing; } } }
}
在MVC中添加ViewEngine Startup.cs
services.AddMvc().Configure<MvcOptions>(options => { options.ViewEngines.Add(Type.GetType("WebApplication10.MyViewEngine")); });
现在我已将我的组件放置在以下位置。例如我的组件名称是 MyFirst.cshtml。所以我可以放置 Views/Components/MyFirst/Default.cshtml.
基本上您可以通过创建自定义视图引擎或创建自定义视图引擎来做到这一点 IViewLocationExpander
但是对于 beta-6 中的视图组件,总是会添加 "Components" 前缀。查看 ViewViewComponentResult 源代码。这很可悲。
好消息,您可以通过复制上面的代码并仅替换用于视图搜索的格式字符串来创建自己的视图组件结果。
我知道这是一个老问题,但它可以做得更简单...
services.Configure<RazorViewEngineOptions>(o =>
{
o.ViewLocationFormats.Add("/views/{0}.cshtml");
});
您还可以为 .NET Core
执行以下操作services
.AddMvc(options =>
{
...
})
.AddRazorOptions(o =>
{
o.AreaViewLocationFormats.Add("Areas/{2}/Views/SUBFOLDER/{1}/{0}.cshtml");
o.ViewLocationFormats.Add("Views/SUBFOLDER/{1}/{0}.cshtml");
})
显然根据您是否使用区域选择 AreaViewLocationFormats
或 ViewLocationFormats
。