public class RoleMenuView
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public int MenuId { get; set; }
public string MenuName { get; set; }
public string MenuUrl { get; set; }
}可以把第三步的过程反过来看,就也能进一步了解导航动态实现的效果。
(4). Component.InvokeAsync()方式,实现动态菜单。
(4.1).第三步中的RoleMenuView类,还有RolePermissionService中的GetRoleMenus()保持不变。
(4.2)在项目根目录中新加一个文件夹:Components,里面新建一个类文件:NavViewCompoent.cs.
代码为(注意:ViewComponent(Name = "Navigation")的声明,Name值就是_Layout中引用的名称):
[ViewComponent(Name = "Navigation")]
public class NavViewCompoent : ViewComponent
{
private readonly IRolePermissionService _rolePermissionService;
public NavViewCompoent(IRolePermissionService rolePermissionService)
{
_rolePermissionService = rolePermissionService;
}
public IViewComponentResult Invoke()
{
if (User.Identity.IsAuthenticated)
{
string RoleId = HttpContext.User.FindFirst(ClaimTypes.Role).Value;//读取用户的Claims信息
var menus = _rolePermissionService.GetRoleMenus(int.Parse(RoleId));
//手动指定了路径的方式,如果是默认:return View(menus);则回自动寻找路径
return View($"~/Views/Shared/Components/Navigation.cshtml", menus);
}
else
return View($"~/Views/Shared/Components/Navigation.cshtml");
}
}(4.3).在Views/Shared/文件夹下(注意,如果采用默认路径,需要这样)再建文件夹Navigation,然后在其内建个default.cshtml的视图文件(代码与上面第三步的_Nav.cshtml的代码一样),用来编写像上面第3步中的_Nav.cshtml的导航文件。我是采用手动指定路径的方式,见上面NavViewCompoent的代码中的return view(),我手动指定了返回路径。