ASP.NET Core 3.1 PRG模式下如何隐藏OnGet入参并实现跨方法传参
解决Razor Pages PRG模式下隐藏参数传递的问题
- ViewData的生命周期仅覆盖当前请求,RedirectToPage触发的是302跨请求跳转,新请求下ViewData会被重置,因此拿不到值是正常现象,不适合跨请求传参。
- TempData本身默认是基于加密Cookie存储(ASP.NET Core 2.0+默认配置),数据不会暴露在URL中,你看到URL里的
input_string参数,是前端提交逻辑或者重定向逻辑的问题,和TempData本身无关。常见的两种错误场景:- 前端表单/JS提交时用了GET方式,或者手动把参数拼接在了跳转的目标URL上
- 调用RedirectToPage时手动传入了路由参数,比如写了
return RedirectToPage("GetData", new { input_string = xxx }),这会自动把参数拼到URL上
正确实现方案
1. 修正后端代码
你当前贴的TempData核心逻辑是对的,只需要根据场景做小优化即可:
public async Task<IActionResult> OnPostData(string input_JSON) { // TempData存储的内容会在读取后自动清除,如果需要保留供后续请求用可以加TempData.Keep("InputJSON") TempData["InputJSON"] = input_JSON; // 这里不要加额外的路由参数,直接跳转页面即可 return RedirectToPage("GetData"); } public async Task<IActionResult> OnGetGetData() { string inputJson = TempData["InputJSON"] as string; if (string.IsNullOrEmpty(inputJson)) { // 可添加异常处理,拦截非法直接访问GetData页面的请求 return BadRequest("参数丢失"); } // 后续业务处理逻辑 }
如果你的JSON字符串长度超过4KB(Cookie默认大小限制),可以改用基于Session的TempData,只需要在Program.cs里加配置:
builder.Services.AddSession(); builder.Services.AddControllersWithViews().AddSessionStateTempDataProvider(); // 中间件要放在路由之后、授权之前 app.UseSession();
2. 修正前端逻辑
如果是JS触发提交后打开新窗口的场景,不要手动把参数拼到GetData的URL上,示例逻辑:
// 正确逻辑:先POST提交数据到OnPostData,成功后直接打开GetData页面即可,不需要拼接参数 fetch('/你的当前页面名?handler=Data', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value }, body: 'input_JSON=' + encodeURIComponent(你的JSON字符串) }).then(res => { if (res.ok) { // 直接打开GetData页面,不要带任何参数 window.open('/GetData'); } })
排查你的JS代码,去掉所有给/GetData路径拼接input_string参数的逻辑即可。
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

