mvc6:为viewComponents的视图指定自定义位置

时间:2015-01-08 15:32:28

标签: asp.net-core-mvc

默认情况下,mvc6会在/Views/ControllerUsingVc/Components中搜索ViewComponents的视图,或者它也会在/views/shared文件夹中查找。 是否可以添加自定义位置以查找它们?例如。 /views/mySharedComponents

4 个答案:

答案 0 :(得分:6)

您可以这样做,但您必须执行以下步骤。

  1. 基于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;                
                }
            }
    
        }
    

    }

  2. 在Startup.cs中的MVC中添加ViewEngine

    services.AddMvc().Configure<MvcOptions>(options =>
            {              
                options.ViewEngines.Add(Type.GetType("WebApplication10.MyViewEngine"));             
    
            });
    
  3. 现在我已将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");
    })

根据您是否在使用“区域”,显然选择AreaViewLocationFormatsViewLocationFormats