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

.NET Core 路由传值持久化需求:静态类存储首次传入参数

.NET Core 持久化首次传入的餐厅编号解决方案

核心注意点

绝对不要用静态变量存储该值——静态变量是全局共享的,多用户访问时会互相覆盖,完全无法实现类似Cookie的用户隔离效果。以下是几种可行的解决方案:

方案1:Session存储

适合服务器端管理的用户会话场景,数据存储在服务器内存或分布式缓存中。

配置Session(.NET 6+)

在Program.cs中添加Session服务和中间件:

// 注册Session服务
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(2); // 设置会话过期时间
    options.Cookie.HttpOnly = true; // 防止前端JS读取,提升安全性
    options.Cookie.IsEssential = true; // 标记为必要Cookie,符合合规要求
});

// 启用Session中间件(需放在UseRouting之后,UseAuthorization之前)
app.UseSession();

首次访问时存入Session

在接收餐厅编号的控制器Action中处理:

public IActionResult Index(string restaurantnumber)
{
    if (!string.IsNullOrWhiteSpace(restaurantnumber))
    {
        HttpContext.Session.SetString("RestaurantNumber", restaurantnumber);
    }
    return View();
}

后续读取使用

在任意控制器或视图中直接读取:

// 控制器中
var restaurantNumber = HttpContext.Session.GetString("RestaurantNumber");

// Razor视图中
@Context.Session.GetString("RestaurantNumber")

方案2:Cookie存储

适合需要客户端持久化的场景,数据存储在用户浏览器中。

首次访问时写入Cookie

public IActionResult Index(string restaurantnumber)
{
    if (!string.IsNullOrWhiteSpace(restaurantnumber))
    {
        Response.Cookies.Append("RestaurantNumber", restaurantnumber, new CookieOptions
        {
            Expires = DateTimeOffset.Now.AddHours(2), // 设置过期时间
            HttpOnly = true,
            Secure = true, // 生产环境建议开启,需HTTPS支持
            SameSite = SameSiteMode.Lax // 防止CSRF攻击
        });
    }
    return View();
}

后续读取使用

// 控制器中
var restaurantNumber = Request.Cookies["RestaurantNumber"];

// Razor视图中
@Context.Request.Cookies["RestaurantNumber"]

优化:自动传递参数(无需手动拼接路由)

如果是MVC项目,可以通过ActionFilter自动给Action参数赋值,避免每个页面跳转都手动传递:

实现自定义过滤器

public class RestaurantNumberFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 如果Action参数包含restaurantnumber且未赋值,自动从Session/Cookie读取填充
        if (context.ActionArguments.TryGetValue("restaurantnumber", out var value) && value == null)
        {
            var restaurantNumber = context.HttpContext.Session.GetString("RestaurantNumber") 
                                 ?? context.HttpContext.Request.Cookies["RestaurantNumber"];
            if (!string.IsNullOrWhiteSpace(restaurantNumber))
            {
                context.ActionArguments["restaurantnumber"] = restaurantNumber;
            }
        }
    }

    public void OnActionExecuted(ActionExecutedContext context) { }
}

注册过滤器

在Program.cs中添加:

builder.Services.AddControllersWithViews(options =>
{
    options.Filters.Add<RestaurantNumberFilter>();
});

这样后续Action只要定义了restaurantnumber参数,就会自动从Session/Cookie取值,无需手动传递。

内容的提问来源于stack exchange,提问作者Ramazan Musluoğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:50:40