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

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存储用户信息,避免敏感数据泄露:

  1. 修改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));
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:55:14