ViewComponents in Areas

时间:2015-06-02 01:28:27

标签: asp.net-core-mvc

我可能做错了(我找不到任何其他方式的文档)。 在区域中创建ViewComponent时,搜索路径不正确:

namespace HelloWorld
{
    [Area("Test")]
    public class HelloViewComponent : ViewComponent
    {
        public IViewComponentResult Invoke()
        {
            return View();
        }
    }
}

不是在/Areas/Test/Views/Components/Hello/Default.cshtml搜索视图,而是抛出以下异常:

InvalidOperationException: The view 'Components/Hello/Default' was not found. The following locations were searched:
/Views/Home/Components/Hello/Default.cshtml
/Views/Shared/Components/Hello/Default.cshtml.

我通过执行以下操作来调用视图:(在/Views/Home/Index.cshtml

@Component.Invoke("Hello")

似乎没有办法包含一个区域来调用视图。

关于从区域内调用ViewComponent的正确方法的任何想法,或者如果上述错误并且我犯了错误。

https://github.com/aspnet/Mvc/issues/2640

3 个答案:

答案 0 :(得分:4)

Area属性只能与控制器一起使用。当您对某个区域内的视图发出请求时,如果该视图中包含任何引用的视图组件,则MVC会按特定顺序查找视图组件的视图。
以下是当请求与基于区域的控制器与非区域控制器匹配时,如何搜索视图组件视图的区别。

示例:

  1. 查看组件的/Admin/Home/Index请求的视图搜索路径,其中Admin是一个区域。

    • /Areas/Admin/Views/Home/Components/Products/Default.cshtml
    • /Areas/Admin/Views/Shared/Components/Products/Default.cshtml
    • /Views/Shared/Components/Products/Default.cshtml。
  2. 查看组件的/Home/Index(非区域请求)请求的视图搜索路径

    • /Views/Home/Components/Products/Default.cshtml
    • /Views/Shared/Components/Products/Default.cshtml。

答案 1 :(得分:4)

ViewComponents文件应如下所示:

ViewComponent in MVC Area

然后从View:

调用
@await Component.InvokeAsync(typeof(Swastika.Web.Start.Areas.Portal.ViewComponents.MainSidebar));

这对我有用。希望这是有帮助的!

答案 2 :(得分:2)

使用组件时,您应该能够使用视图的绝对路径,如此视图("〜/ Areas / Test / Views / Components / Hello / Default.cshtml")来解决您的问题。