Asp.net core mvc 查看区域中的组件

Asp.net core mvc 查看区域中的组件,asp.net-core-mvc,Asp.net Core Mvc,我可能做错了(我找不到任何关于如何以其他方式做这件事的文档)。 在区域中创建ViewComponent时,搜索路径不正确: namespace HelloWorld { [Area("Test")] public class HelloViewComponent : ViewComponent { public IViewComponentResult Invoke() { return View();

我可能做错了(我找不到任何关于如何以其他方式做这件事的文档)。 在区域中创建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

似乎没有一种方法可以包含从中调用视图的区域

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


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

例如:

  • 查看组件对请求的查看搜索路径,如
    /Admin/Home/Index
    ,其中
    Admin
    是一个区域

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

    • /视图/Home/Components/Products/Default.cshtml
    • /视图/Shared/Components/Products/Default.cshtml

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

    ViewComponents文件应按如下方式放置:

    然后从视图中调用:

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

    这对我有用。我希望有帮助

    因此,您的意思是(简而言之):搜索路径与它所调用的上下文相关-如果我错了,请纠正我-遗憾的是,这不是我一直在寻找的答案-但我感谢您的解释,并且现在理解了这个问题。@logikal:局部视图没有消失,但在MVC6中它们是不同的。还有一个Html.Partial和PartialViewResult@logikal:请从下面看我的答案。嗨,谢谢你的答案-我这些天不做.NET工作,所以我不能把这个答案标记为比已经回答的更好的答案,但是如果有人想尝试一下,看看它是否回答了这个问题,请放心,我会改变答案。这正是我所需要的。
    @await Component.InvokeAsync(typeof(Swastika.Web.Start.Areas.Portal.ViewComponents.MainSidebar));