📜  视图组件中的用户(当前登录用户) - C# (1)

📅  最后修改于: 2023-12-03 14:57:22.233000             🧑  作者: Mango

视图组件中的用户(当前登录用户) - C#

在Web应用程序中,经常需要根据当前登录用户的身份信息更改UI元素或者隐藏某些功能。重复编写代码来获取当前用户的信息并不是一个好选择,因此ASP.NET Core提供了视图组件,以便集中处理这些任务。

视图组件

视图组件是实现一个类似于控件的可重用组件的一种方式。它可以有自己的视图文件和模型数据,并且可以处理数据和呈现HTML。它也可以处理请求操作,就像控制器一样。视图组件可以在任何视图或者布局中使用,而不需要重复编写相同的代码。

获取当前用户

在视图组件和控制器中,可以通过HttpContext来获取当前请求的上下文。通过HttpContext我们可以访问到所有和请求相关的信息,包括Cookies、Session、身份验证信息等。

要获取当前登录的用户,可以使用User属性,它返回一个ClaimsPrincipal的实例。ClaimsPrincipal包含用户的身份验证所需的所有信息,如用户名、角色、声明等。可以将ClaimsPrincipal看作是一个包含用户信息的容器。

实现视图组件

视图组件需要继承自ViewComponent,并通过ViewComponent特性来指定视图组件名称。它包含一个InvokeAsync方法用来处理请求。

在InvokeAsync 方法中,可以获取HttpContext的用户信息,以及其它所需的数据。下面是一个示例:

[ViewComponent(Name = "UserInfo")]
public class UserInfoViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        var user = HttpContext.User.Identity;
        var model = new UserInfoViewModel { UserName = user.Name };
        return View(model);
    }
}

在这个示例中,我们通过ViewComponent特性来指定了视图组件的名称为UserInfo。InvokeAsync方法中我们获取HttpContext.User的Identity并将其赋值给一个名称为model的UserInfoViewModel对象。视图组件需要返回一个视图结果,我们通过View()方法来将model传递给视图并返回视图结果。

在视图中使用

视图组件的名称就是在视图中使用它的名称。使用asp-page或者asp-action时也是同样的方式。

例如,假设我们有一个名为_UserInfo的部分视图组件。我们需要在页面中使用它,只需要在需要使用的地方添加以下代码:

<vc:UserInfo />

在 Razor 页面中,必须包含初始的 @using 指令以获取对自定义视图组件的引用:

@using MyApp.Views.Shared.Components
参考资料