You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core Razor页面代码后台读写Cookie?

在Razor页面代码后台读写Cookie的正确姿势

当然可以在Razor Pages的代码后台(也就是PageModel类)里读写Cookie!你遇到的Response为空的空引用错误,大概率是因为在错误的时机访问了请求上下文(比如构造函数里),而不是Razor Pages不支持这个操作。下面给你详细讲清楚怎么正确实现:

一、写Cookie:选对时机很重要

Razor Pages的PageModel在构造阶段,HttpContext还没被框架初始化,这时候访问Response肯定会是空的。你要把写Cookie的逻辑放在页面的处理方法(比如OnGet、OnPost)或者合适的生命周期钩子(比如OnPageHandlerExecuting)里,这时候Response已经可用了。

示例代码:

public class IndexModel : PageModel
{
    // 比如在一个自定义的Post方法里写入Cookie
    public IActionResult OnPostSetUserCookie()
    {
        // 按需配置Cookie的各项参数
        var cookieOptions = new CookieOptions
        {
            Expires = DateTimeOffset.Now.AddDays(7), // 设置7天过期
            HttpOnly = true, // 禁止前端JS读取,提升安全性
            Secure = Environment.IsProduction(), // 生产环境强制HTTPS传输
            SameSite = SameSiteMode.Lax // 平衡兼容性与CSRF防护
        };

        // 把Cookie添加到响应中
        Response.Cookies.Append("CurrentUser", "Dave", cookieOptions);

        return RedirectToPage();
    }
}

二、读Cookie:安全获取避免异常

读取Cookie的逻辑和写类似,同样放在OnGet、OnPost等处理方法里,通过Request.Cookies安全获取:

示例代码:

public class IndexModel : PageModel
{
    // 定义属性存储Cookie值,供Razor页面直接调用
    public string CurrentUserName { get; set; }

    public void OnGet()
    {
        // 用TryGetValue避免键不存在时抛出异常
        if (Request.Cookies.TryGetValue("CurrentUser", out string userName))
        {
            CurrentUserName = userName;
        }
        else
        {
            CurrentUserName = "Guest";
        }
    }
}

之后你就能在Razor页面里直接用@Model.CurrentUserName显示这个值了。

三、关于依赖注入的疑问

在PageModel里,你不需要额外注入任何依赖!框架已经自动为PageModel注入了HttpContext相关的实例,所以你可以直接使用Response和Request属性。

只有当你需要在非PageModel的类(比如自定义服务)里操作Cookie时,才需要注入IHttpContextAccessor,然后通过它获取HttpContext:

public class CookieService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public CookieService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void SetCookie(string key, string value)
    {
        _httpContextAccessor.HttpContext?.Response.Cookies.Append(key, value);
    }
}

不过这种场景比较少见,在PageModel里直接用自带的Response/Request就足够了。

避坑小总结

  • 绝对不要在PageModel的构造函数里访问Response或Request,此时上下文还未初始化,必出空引用错误!
  • 所有Cookie操作都放在OnGet、OnPost等页面处理方法,或者OnPageHandlerExecuting这类生命周期方法里。
  • 配置Cookie时,记得加上HttpOnly、Secure(生产环境)、SameSite这些安全属性,避免潜在的安全风险。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:27:33