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

部署在IIS的ASP.NET Core Razor Pages应用为何跨设备共享变量?

问题原因及解决办法

1. 静态变量导致全局共享

你在orderformModel里定义的firstname是静态变量(带static修饰),静态变量属于类本身,不是类的实例对象。在ASP.NET Core应用中,同一个应用进程内的所有请求都会共享这个静态变量——不管是哪个用户、哪个设备的请求,读写的都是同一个值,所以不同设备会看到相同的姓名。

2. Session无效的可能原因

你说用Session也没用,大概率是Session没正确配置或使用:

  • 没在Program.cs中注册Session服务和添加中间件:ASP.NET Core默认不启用Session,必须手动配置。
  • 存储或读取Session时出错:比如键名写错,或者没从当前请求的Session中取值。

正确实现方式

方式一:用Session存储用户专属数据

第一步:配置Session

在Program.cs中添加Session相关配置:

var builder = WebApplication.CreateBuilder(args);

// 注册Session服务
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置Session超时时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 注册IHttpContextAccessor(用于在视图中获取Session)
builder.Services.AddHttpContextAccessor();

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

// 添加Session中间件(必须放在UseRouting之后、UseAuthorization之前)
app.UseSession();

app.MapRazorPages();

app.Run();

第二步:修改orderform.cshtml.cs存储数据到Session

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace mysite.Pages
{
    public class orderformModel : PageModel
    {
        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPostUpdateAsync(string firstnamein)
        {
            // 将姓名存入当前用户的Session
            HttpContext.Session.SetString("Firstname", firstnamein);
            return Content("OK");
        }
    }
}

第三步:修改orderview.cshtml从Session读取数据

@page
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
@{
    Layout = "_PlainLayout";
    // 从Session读取姓名,没有则显示Guest
    var firstname = HttpContextAccessor.HttpContext.Session.GetString("Firstname") ?? "Guest";
}

<div>
    Hello @firstname
</div>

方式二:用TempData传递一次性数据

如果只是在提交orderform后跳转展示数据,TempData更适合(数据仅保留到下一次请求):

修改orderform.cshtml.cs

public async Task<IActionResult> OnPostUpdateAsync(string firstnamein)
{
    TempData["Firstname"] = firstnamein;
    return Content("OK");
}

修改orderview.cshtml

@page
@{
    Layout = "_PlainLayout";
    var firstname = TempData["Firstname"] ?? "Guest";
}

<div>
    Hello @firstname
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:22:35