我可能做错了(我找不到任何其他方式的文档)。 在区域中创建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的正确方法的任何想法,或者如果上述错误并且我犯了错误。
答案 0 :(得分:4)
Area
属性只能与控制器一起使用。当您对某个区域内的视图发出请求时,如果该视图中包含任何引用的视图组件,则MVC会按特定顺序查找视图组件的视图。
以下是当请求与基于区域的控制器与非区域控制器匹配时,如何搜索视图组件视图的区别。
示例:
查看组件的/Admin/Home/Index
请求的视图搜索路径,其中Admin
是一个区域。
查看组件的/Home/Index
(非区域请求)请求的视图搜索路径
答案 1 :(得分:4)
ViewComponents文件应如下所示:
然后从View:
调用@await Component.InvokeAsync(typeof(Swastika.Web.Start.Areas.Portal.ViewComponents.MainSidebar));
这对我有用。希望这是有帮助的!
答案 2 :(得分:2)
使用组件时,您应该能够使用视图的绝对路径,如此视图("〜/ Areas / Test / Views / Components / Hello / Default.cshtml")来解决您的问题。