在_Layout中访问cookie.cshtml在ASP.净的核心

本文关键字:ASP 核心 cshtml cookie Layout 访问 | 更新日期: 2023-09-27 18:02:32

我试图在登录成功时将身份验证密钥存储到我的cookie中:

HttpContext.Response.Cookies.Append("Bearer", accessToken, cookieMonsterOptions);

在控制器类中这是有效的。我可以很容易地创建和读取我的cookie。但现在我想检查,如果它存在,读取我的_Layout.cshtml中的cookie的值,并显示登录用户的名称-或登录链接。但是我如何在部分_Layout.cshtml中读取cookie呢?

string value = HttpContext.Request.Cookies.Get("Bearer");

是行不通的。它试图添加System.Web到我的使用或说HttpContext是静态的,需要一个引用来访问Request

有什么建议或想法吗?

在_Layout中访问cookie.cshtml在ASP.净的核心

. NET Core不再有静态HttpContext的概念。新的微软Web框架中的依赖注入规则。关于视图,有@inject指令用于访问已注册的服务,如IHttpContextAccessor服务(https://docs.asp.net/en/latest/mvc/views/dependency-injection.html)。

使用IHttpContextAccessor,您可以获得HttpContext和cookie信息,如本例所示。

 @inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
 @{
    foreach (var cookie in HttpContextAccessor.HttpContext.Request.Cookies)
    {
        @cookie.Key  @cookie.Value
    }
}

所以我找到了解决方案,如果有人需要的话:

IHttpContextAccessor的服务添加到ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

_Layout.cs注入IHttpContextAccessor:

@inject IHttpContextAccessor httpContextaccessor

使用

访问cookie
@Html.Raw(httpContextaccessor.HttpContext.Request.Cookies["Bearer"])

您不需要依赖注入或其他任何东西。在ASP上访问cookie。. NET Core 2.0 MVC在视图中:

@{
Context.Request.Cookies.TryGetValue("Bearer", out string value);
}

还有另一种方法来处理这种情况:使用视图组件。

下面是一个简单的例子:

LoggedInComponent.cs:

public class LoggedInComponent: ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        return View(HttpContext.Request.Cookies.Get("Bearer"));
    }
}

组件视图:

@model string
@Html.Raw(Model)

_Layout.cshtml:

@await Component.InvokeAsync("LoggedInComponent")

参见https://docs.asp.net/en/latest/mvc/views/view-components.html

编辑直接访问cookie

@using Microsoft.AspNetCore.Http;
@Context.Request.Cookies.Get("Bearer")

参见如何在asp.net Core MVC 1.0中从视图访问session

CookieManager wrapper允许您在asp.net core中读取/写入/更新/删除http cookie。它有流畅的API,方便使用。

试试我的nuget包:https://github.com/nemi-chand/CookieManager

它有两个接口ICookie和ICookieManager,这可以帮助你在asp.net core中玩http cookie

在启动类的配置服务中添加CookieManager

//add CookieManager
services.AddCookieManager();

在布局页面中注入Cookie管理器

@inject CookieManager.ICookie _httpCookie
_httpCookie.Get("Bearer")

我已经为此挣扎了大约2个小时,因为这些方法都不适合我在。net Core 2.2中读取_Layout中的cookie值。CSHTML导致空白值或错误。我有一个cookie集,存储了用户连接到的数据库的名称,我想在web应用程序的页脚显示这个(即Training或Live)。

在_Layout.cshtml的顶部添加以下内容:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor

然后我在我想要显示cookie值的位置添加了这个:

@if (@HttpContextAccessor.HttpContext.Request.Cookies.TryGetValue("SystemDatabase", out string SystemDatabase))
{
  @SystemDatabase @:System
}
else
{
  @:Live System
}

现在打印"现场系统"或"培训系统"。不需要修改Startup.cs