默认情况下,mvc6会在/Views/ControllerUsingVc/Components
中搜索ViewComponents的视图,或者它也会在/views/shared
文件夹中查找。
是否可以添加自定义位置以查找它们?例如。 /views/mySharedComponents
答案 0 :(得分:6)
您可以这样做,但您必须执行以下步骤。
基于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;
}
}
}
}
在Startup.cs中的MVC中添加ViewEngine
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ViewEngines.Add(Type.GetType("WebApplication10.MyViewEngine"));
});
现在我已将My Component放在以下位置。例如,我的组件名称是MyFirst.cshtml。所以我可以放置Views / Components / MyFirst / Default.cshtml。
答案 1 :(得分:2)
基本上,您可以通过创建自定义视图引擎或创建自定义IViewLocationExpander
来执行此操作但对于beta-6中的视图组件,总会有&#34;组件&#34;添加前缀。查看ViewViewComponentResult源代码。这很难过。
好消息是,您可以通过复制上面的代码并仅替换格式字符串进行视图搜索来创建自己的视图组件结果。
答案 2 :(得分:1)
我知道这是一个老问题,但可以做得更简单......
services.Configure<RazorViewEngineOptions>(o =>
{
o.ViewLocationFormats.Add("/views/{0}.cshtml");
});
答案 3 :(得分:0)
您还可以对 .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
。