在_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
。
有什么建议或想法吗?
. 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