ASP.NET Core中RedirectToAction()方法失效问题求助
问题原因
RedirectToAction() 本质是触发302重定向,浏览器会针对目标URL发起一个GET请求,但你的OTPInput方法标记了[HttpPost],只接受POST请求,因此路由无法匹配,自然不会进入该动作方法。
而View("OTPInput", model)是直接在当前POST请求上下文返回视图,不需要浏览器重新发起请求,所以能正常显示对应页面,但这不属于重定向。
解决方案
方案1:修改OTPInput的请求方法为GET
OTP输入页面是展示型页面,适合用GET请求访问,直接将[HttpPost]改为[HttpGet]即可:
[HttpGet] // 替换原有的[HttpPost] [Route("[action]")] public async Task<IActionResult> OTPInput(LogInViewModel viewModel) { return View("InputOTP"); }
方案2:用TempData传递敏感数据(更安全)
注意:直接通过重定向传递密码会暴露在URL中,存在安全风险,建议用TempData存储用户信息,避免敏感数据泄露:
- 修改
LogIn方法:
[HttpPost] public async Task<IActionResult> LogIn(LogInViewModel model) { if (model.UserName != "Usertest" && model.Password != "Passtest") { ModelState.AddModelError("Denied", "Invalid Username/Password"); return View("Index", model); } // 存储用户名到TempData,避免密码出现在URL中 TempData["UserName"] = model.UserName; return RedirectToAction(nameof(OTPInput)); }
- 修改
OTPInput方法:
[HttpGet] [Route("[action]")] public async Task<IActionResult> OTPInput() { var userName = TempData["UserName"] as string; var viewModel = new LogInViewModel { UserName = userName }; return View("InputOTP", viewModel); }
额外说明
如果业务上必须让OTPInput接受POST请求,那么不能使用RedirectToAction,可以考虑:
- 在当前POST请求中直接返回
InputOTP视图(即你之前的View("OTPInput", model)方式) - 或者使用前端隐藏表单自动提交的方式,触发到
OTPInput的POST接口
内容的提问来源于stack exchange,提问作者yam cantorna
相关产品推荐
相关产品推荐

