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

