不同区域中的组件,更改默认搜索位置

时间:2017-04-09 11:12:44

标签: asp.net-core asp.net-core-mvc

我在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);
}

但我不喜欢它。如果有人知道如何覆盖有用的组件默认搜索位置:)

0 个答案:

没有答案