如何使用字符串重定向到操作

问题描述 投票:0回答:2

我是 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);

找不到页面错误http://localhost:12345/Auth/%2FApp%2Ftrips

c# model-view-controller
2个回答
2
投票

RedirectToAction
中,我们需要传递控制器名称和操作名称作为参数 而
Redirect()
只需要Url

您只需执行以下操作即可

   return Redirect(returnUrl);

0
投票

如果您在使用

RedirectToAction
时遇到将正斜杠“/”转换为编码字符串的问题,您可以尝试使用 Url.Action 方法。以下是修改代码的方法:

return Redirect(Url.Action("Show", new { id = id }));

这将正确生成 URL,而无需对正斜杠进行编码。

Show 是我作为参数传递的控制器函数名称和 id。

希望它对您的代码有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.