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

ASP.NET Razor页面点击提交按钮后如何保留Get请求中的值

ASP.NET Razor页面:Post请求中保留Get获取的UserID值

问题原因

你在OnGet中定义的UserID是局部变量,Razor Pages中每个请求(Get和Post)都会创建新的页面模型实例,所以Post请求无法访问Get请求中定义的局部变量。另外,你在OnPost中没有重新从Cookie读取数据,自然拿不到值。

解决方案

1. 直接在Post请求中重新读取Cookie(推荐)

Cookie会在同域名的所有请求中自动携带,所以Post时直接重新解析Cookie即可,这是最可靠的方式:

public async Task OnPost(UC.ADC.Core.Entities.SQL.Branch branch)
{
    string myUserData = Request.Cookies["myUserData"];
    if (!string.IsNullOrEmpty(myUserData))
    {
        UserAuthResponse? userAuthResponse = System.Text.Json.JsonSerializer.Deserialize<UserAuthResponse>(myUserData);
        string userID = userAuthResponse?.Data?.UserID;
        // 这里使用userID执行后续逻辑
    }
}

添加空值判断可以避免Cookie不存在或解析失败时出现异常,确保代码健壮性。

2. 用页面模型属性+表单隐藏字段传递

如果需要在页面中复用这个值,或者不想重复解析Cookie,可以将UserID定义为页面模型的绑定属性,再通过表单隐藏字段回传:

首先修改页面模型类:

public class YourPageModel : PageModel
{
    [BindProperty]
    public string UserID { get; set; }

    public void OnGet()
    {
        string myUserData = Request.Cookies["myUserData"];
        UserAuthResponse? userAuthResponse = System.Text.Json.JsonSerializer.Deserialize<UserAuthResponse>(myUserData);
        UserID = userAuthResponse.Data.UserID;
    }

    public async Task OnPost(UC.ADC.Core.Entities.SQL.Branch branch)
    {
        // 直接使用UserID属性,值由表单隐藏字段自动回传
    }
}

然后在表单中添加隐藏字段:

<form method="post">
    <input type="hidden" asp-for="UserID" />
    <div class="form-group row" style="margin-left:200px;font-size:15px;font-family: 'Open Sans' , sans-serif;font-weight: bold;">
        <button type="submit" class="col-sm-1 btn btn-primary">Submit</button>
    </div>
</form>

注意:隐藏字段的值可以被客户端篡改,如果UserID是敏感数据,建议优先使用第一种方式从Cookie重新读取,避免安全风险。

3. 使用TempData临时存储

TempData用于在两次请求之间传递数据,适合一次性场景:

public void OnGet()
{
    string myUserData = Request.Cookies["myUserData"];
    UserAuthResponse? userAuthResponse = System.Text.Json.JsonSerializer.Deserialize<UserAuthResponse>(myUserData);
    TempData["UserID"] = userAuthResponse.Data.UserID;
}

public async Task OnPost(UC.ADC.Core.Entities.SQL.Branch branch)
{
    string userID = TempData["UserID"] as string;
    // 执行后续逻辑
    // 如果需要在后续请求中继续使用,调用TempData.Keep("UserID")
}

TempData中的数据默认在读取后会被删除,如果Post后还有页面跳转需要保留数据,记得调用Keep()方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:48:10