.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
相关产品推荐
相关产品推荐

