我是 MVC 新手,因此希望对以下方面有任何帮助。
我有一个用于登录的 AuthController,如果有一个 returnUrl,我想返回到该 url。它似乎在当前控制器(Auth)中查找 returnUrl(/App/Trips),但如果我指定控制器,它就可以正常工作。
关于为什么 RedirectToAction(returnUrl) 不起作用但 RedirectToAction("Trips", "App") 起作用有什么想法吗?
我想知道这和映射有什么关系吗?这就是我所拥有的:
Startup.cs 中的映射
config.MapRoute(
name: "Default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "App", action = "Index" }
);
AuthController.cs
[HttpPost]
public async Task<ActionResult> Login(LoginViewModel vm, string returnUrl)
{
if(ModelState.IsValid)
{
var signInResult = await _signInManager.PasswordSignInAsync(vm.Username, vm.Password, true, false);
if (signInResult.Succeeded)
{
if(string.IsNullOrWhiteSpace(returnUrl))
{
return RedirectToAction("Trips", "App");
}
else
{
//return RedirectToAction(returnUrl); // Doesn't work - tries to find /App/trips under /Auth
return RedirectToAction("Trips", "App"); // Works! goes straight to /App/trips
}
}
else
{
ModelState.AddModelError("", "Username or Password is incorrect");
}
}
return View();
}
上面 run = "/App/trips" 时的 returnUrl 值
通过时
return RedirectToAction("Trips", "App");
按预期前往 http://localhost:12345/App/Trips
失败时
return RedirectToAction(returnUrl);
在
RedirectToAction
中,我们需要传递控制器名称和操作名称作为参数
而Redirect()
只需要Url
您只需执行以下操作即可
return Redirect(returnUrl);
如果您在使用
RedirectToAction
时遇到将正斜杠“/”转换为编码字符串的问题,您可以尝试使用 Url.Action 方法。以下是修改代码的方法:
return Redirect(Url.Action("Show", new { id = id }));
这将正确生成 URL,而无需对正斜杠进行编码。
Show 是我作为参数传递的控制器函数名称和 id。
希望它对您的代码有所帮助。