我在ASP.NET Core MVC的新功能中遇到了这些组件。我的问题是我想将组件放在特定区域,但我无法更改组件视图的默认搜索位置。
这是我的区域示例。我把网站的标题组件放在不同的区域:
Areas
Site
Components
HeaderViewComponent
Views
Shared
Components
Header
Default.cshtml
这是组件的默认搜索位置。现在在我的Header组件中,我发送带有model的视图:
public async Task<IViewComponentResult> InvokeAsync()
{
return View(headerModel);
}
我从网站布局中调用此组件,这对所有人来说都很常见:
Views
Shared
_Layout
@await Component.InvokeAsync(typeof(WebUI.Areas.Site.HeaderViewComponent))
这不起作用。我有错误:
InvalidOperationException: The view 'Components/Header/Default' was not found. The following locations were searched:
/Views/Home/Components/Header/Default.cshtml
/Views/Shared/Components/Header/Default.cshtml
这个错误来自于我将该组件称为区域外的组件。我有另一个组件,我在它工作的区域调用。我试图定义一个特定的搜索位置
app.UseMvc(routes =>
{
routes.MapRoute(name: "areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
services.AddMvc()
.AddRazorOptions(options =>
//"~/Areas/Site/Views/Shared/Components/Header/Default.cshtml"
options.ViewLocationFormats.Add("/Areas/{3}/Views/Shared/Components/{1}/{0}.cshtml");
});
这不适用于组件。组件似乎只有默认值。我不知道如何改变它。
我通过发送视图的完整名称找到了解决方案,该方法有效:
public async Task<IViewComponentResult> InvokeAsync()
{
return View("~/Areas/Site/Views/Shared/Components/Header/Default.cshtml", headerModel);
}
但我不喜欢它。如果有人知道如何覆盖有用的组件默认搜索位置:)