如何更改ASP.NET Core查找ViewComponents的位置?

时间:2018-12-16 08:29:21

标签: asp.net-core

我想以一种对我来说有意义的方式来排列我的组件文件夹。问题是我一旦完成,ASP.NET找不到组件。仅当我将它们放在“共享/组件”或“视图/ {NameOfView} /组件”中时才能找到它们。有没有办法配置它?

3 个答案:

答案 0 :(得分:1)

您可以将组件和视图放置在任意位置。

例如

我在Views中创建了一个名为Info的文件夹

然后我在该文件夹中创建一个名为Tested.cshtml的视图

所以在我的主项目目录中,我有:

ProjectName > Views > Info > Tested.cshtml

然后我在主项目目录中创建了一个名为ViewComponents的文件夹。

然后在该文件夹中创建了一个类-该名称不需要继承ViewComponent,只要它继承了ViewComponent并且具有IViewComponentResult Invoke()

为了使整个项目更加清晰,我在VC后添加了ViewComponents。

所以现在我也有:

ProjectName > ViewComponents > TestingVC.cs

在该类的Invoke方法中,我将其直接指向刚创建的ViewComponent位置,确保使用~到达主项目的根。

public class TestingVC : ViewComponent
{
    public IViewComponentResult Invoke()
    {
        return View("~/Views/Info/Tested.cshtml");
    }
}

然后,您只需在另一个视图中的任何地方调用ViewComponent类,就可以使用nameof来避免魔术字符串:

@await Component.InvokeAsync(nameof(ProjectName.ViewComponents.TestingVC))

简单!

THere可能是一种在不使用魔术字符串的情况下获取cshtml文件目录的方法,但是至少在此演示中,您基本上可以将ViewComponentsViews放在您喜欢的任何位置

答案 1 :(得分:0)

根据Microsoft Documentaiton

  

运行时在以下路径中搜索View组件的视图:

     

/Pages/Components/{View Component Name}/{View Name}

     

/Views/{Controller Name}/Components/{View Component Name}/{View Name}

     

/Views/Shared/Components/{View Component Name}/{View Name}

     

视图组件的默认视图名称为Default,这意味着您的视图文件通常将命名为Default.cshtml。创建视图组件结果或调用View方法时,可以指定其他视图名称。

     

我们建议您命名视图文件Default.cshtml,并使用Views/Shared/Components/{View Component Name}/{View Name}路径。

尽管运行时可以在上述三个路径中进行搜索,但是Microsoft建议在三个路径中使用以下路径:

/Views/Shared/Components/{View Component Name}/{View Name}

这很有意义!因为ViewComponent实际上是共享视图,可用于从布局页面到任何单独页面的应用程序中的任何位置。因此,根据特性,应始终将其放置在“共享”文件夹中。

谢谢。

答案 2 :(得分:0)

尽管官方文档中没有提供有关如何自定义视图组件位置的描述,但是您仍然可以按照有关如何使用普通View文件进行操作的教程进行操作。

简而言之:

  1. 您需要自定义RazorViewEngineOptions选项以告知Razor视图文件的位置
  2. 此外,您需要创建一个Components/YourViewComponentName/文件夹以告知Razor您的视图组件所在的位置。

详细信息

假设您要创建一个视图组件,以呈现具有不同主题的不同视图文件:

public class MyViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync( string template, string theme)
    {
        template = string.IsNullOrEmpty(template) ? "Default": template; 
        theme = string.IsNullOrEmpty(theme) ? "" : "." +theme;
        return View(template+theme);
    }
}

您可以将此文件随意放置在任何地方。为了进行测试,我创建了一个文件夹,如下所示:

Your project folder/
    App.csproj
    MyLocations/
        MyViewComponent.cs                     # MyViewComponent class 
        DefaultTheme/
            Components/                        # The name of `Components` here matters
                My/                            # Your ViewComponentName
                    Default.cshtml             # view file of your view component
                    Another.cshtml             # view file of your view component
        Theme2/
            Components/                        # The name of `Components` here matters
                My/                            # Your ViewComponentName
                    Default.Theme2.cshtml      # view file of your view component
                    Another.Theme2.cshtml      # view file of your view component
    Views/
    Controllers/

请注意,文件夹名称My应该与视图组件名称保持一致。如果您将名称自定义为Our,则文件夹名称也应更改。

要使其正常运行,只需为RazorViewEngineOptions添加一个配置:

services.Configure<RazorViewEngineOptions>(o =>{
    o.ViewLocationFormats.Add("MyLocations/DefaultTheme/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("MyLocations/Theme2/{0}" + RazorViewEngine.ViewExtension);
});

仅此而已。