【问题标题】:netcore5 View components Customize the view search path not working on areasnetcore5 视图组件自定义视图搜索路径不适用于区域
【发布时间】:2021-06-21 06:08:13
【问题描述】:

我已按照此文档查看视图组件:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-5.0#customize-the-view-search-path

但是当我尝试自定义视图搜索路径时它不起作用,我已经使用此配置作为提到的文档:

services.AddMvc()
    .AddRazorOptions(options =>
    {
        options.ViewLocationFormats.Add("/{0}.cshtml");
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

我也尝试了另一种配置:

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

但没有任何效果

我只需要将视图组件放在名为 Components 的根文件夹中,并且我的应用程序中有区域,因此每个区域都有其名为 components 的根文件夹

更新

问题仅出现在区域上,但根目录工作良好,如文档所述

我也尝试使用此配置,但没有任何效果

services.Configure<RazorViewEngineOptions>(options =>
{
    options.ViewLocationFormats.Add("/{0}" + RazorViewEngine.ViewExtension);
    options.ViewLocationFormats.Add("/Areas/Admin/{0}" + RazorViewEngine.ViewExtension);
});

更新 2

在为区域添加了新的视图位置后,如前所述,它在区域上不起作用,并且搜索到的位置错误不包含我添加的区域的新位置,但是如果您从区域请求视图组件,就会发生这种情况,但是如果您从root请求它你会发现搜索到的位置错误包含你添加的区域位置。

如果我从 /Views/Home/Index.cshtml 请求视图组件

搜索到的位置将是:

InvalidOperationException:未找到视图“组件/测试/默认”。搜索了以下位置:

/Views/Home/Components/Test/Default.cshtml

/Views/Shared/Components/Test/Default.cshtml

/Pages/Shared/Components/Test/Default.cshtml

/Components/Test/Default.cshtml

/Areas/Admin/Components/Test/Default.cshtml

所以这里我添加的 2 个位置完美!

如果我从 /Areas/Admin/Views/Home/Index.cshtml 请求视图组件

搜索到的位置将是:

InvalidOperationException:未找到视图“Components/TestArea/Default”。搜索了以下位置:

/Areas/Admin/Views/Home/Components/TestArea/Default.cshtml

/Areas/Admin/Views/Shared/Components/TestArea/Default.cshtml

/Views/Shared/Components/TestArea/Default.cshtml

/Pages/Shared/Components/TestArea/Default.cshtml

所以这里错过了我添加的 2 个位置!

【问题讨论】:

  • 只要您遵循Components 文件夹 的命名约定,这应该可以工作。所以基本上这意味着你可以将Components文件夹放在你想要的任何地方但是它下面的所有项目都必须遵循视图组件的规则,例如每个文件夹代表一个视图组件,并且必须具有视图组件的名称(如果有,则删除 ViewComponent 后缀)。在那个引用的文件中,它清楚地表明the placeholder "{0}" represents the path "Components/{View Component Name}/{View Name}" - 所以只要遵循它的规则,你就会看到它有效。
  • 路径是正确的,因为当我将相同的文件带到共享文件夹时它可以工作,但是当我将它移到根目录时它不起作用,并且错误不包括我添加的根位置配置
  • 当它对您不起作用时,您应该明确说明如何(任何错误消息?)。实际上,我自己尝试过并确认 它有效。该文件是正确的,这里没有错误。这只是你的问题,或者你自己的假设。
  • 我发现问题只出现在区域上使用组件时,但在根控制器上它像文档一样工作得很好,我已经更新了问题
  • 好吧,你这边还是有问题,我已经尝试使用路径 /Areas/Admin/{0}.cshtml 并且它正常工作在我这边, Components 位于Areas/Admin 下。通常如果它不起作用,你会看到一些错误,说明它试图找到组件的各种路径。

标签: c# asp.net asp.net-core asp.net-core-3.1


【解决方案1】:

根范围和区域范围有 2 种不同的视图位置格式配置。使用哪一个取决于代码运行的位置(在搜索视图时)。所以如果它在根范围内,我们有RazorViewEngineOptions.ViewLocationFormats,但如果它在区域范围内,我们有RazorViewEngineOptions.AreaViewLocationFormats

所以在你的情况下,你需要添加这个:

options.AreaViewLocationFormats.Add("/Areas/Admin/{0}" + RazorViewEngine.ViewExtension);

对于可以应用所有区域的通用格式,我们可以使用为区域名称设计的占位符{2},如下所示:

options.AreaViewLocationFormats.Add("/Areas/{2}/{0}" + RazorViewEngine.ViewExtension);

【讨论】:

  • 是的,谢谢它解决了这个问题,但是如果我们有多个区域,我们都会为每个区域添加一个配置,那么是否有一个占位符而不是“/Areas/Admin”可以解决这个问题?
  • 我找到了,options.AreaViewLocationFormats.Add("/Areas/{2}/{0}" + RazorViewEngine.ViewExtension);
  • 你可以用它来更新你的答案,这将是更强大的答案
  • 是的,我刚刚更新了它。实际上,该文档缺少ViewComponent 的特定信息,因为它说{0} 是动作名称,但对于ViewComponent,它是/Components/{View Component Name}/{View Name without extension}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多