ASP.Core MVC RedirectToAction是在returnUrl前面附加控制器名称

本文关键字:控制器 前面 returnUrl Core MVC RedirectToAction 是在 ASP | 更新日期: 2023-09-27 18:05:18

我正在做一个ASP。. Net core, MVC 6应用。我有一个appcontroller作为我的初始控制器,如果一个用户试图去一个有[authorization]属性的操作,我重定向到我的AuthController进行登录,传入返回的returnUrl。一旦认证,我使用…返回RedirectToAction (returnUrl)。

在调试中,我可以看到returnUrl字符串被设置为/App/timessheets。但是,在浏览器地址栏中,它的地址是http://localhost:49940/Auth/%2FApp%2FTimeSheets。由于某些原因,它在returnUrl前面附加了控制器名称(Auth)。

这是我在AuthController

中的Login动作
    [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("Timesheets", "App");
                }
                else
                {
                    return RedirectToAction(returnUrl);
                }
            }
            else
            {
                ModelState.AddModelError("", "Username or password incorrect");
            }
        }
        return View();
    }

我可以在浏览器地址栏中手动输入http://localhost:49940/App/Timesheets并进入正确的视图。另外,如果我加上

returnUrl = String.Empty;  //Test Only

在…行之前

if (string.IsNullOrWhiteSpace(returnUrl))

使其执行…

return RedirectToAction("Timesheets", "App");

重定向工作正常。所以它与传递"/Controller/Action"格式的字符串变量有关,这是问题所在。

任何想法?

ASP.Core MVC RedirectToAction是在returnUrl前面附加控制器名称

当您已经有一个完整的URL时,您应该返回一个Redirect。当前,您正在执行RedirectToAction,它将尝试重定向到当前控制器(Auth)下的操作。

if (signInResult.Succeeded)
{
   if (string.IsNullOrWhiteSpace(returnUrl))
   {
      return RedirectToAction("Timesheets", "App");
   }
   else
   {
      return Redirect(returnUrl);
   }
}
var redirect = RedirectToAction();
redirect.ActionName = "YourAction"; // or can use nameof("") like  nameof(YourAction);
redirect.ControllerName= "YourCtrl"; // or can use nameof("") like  nameof(YourCtrl);
return redirect;

我想我只是把问题描述写出来了,才发现问题所在。

我改变了…

return RedirectToAction(returnUrl);

……

return RedirectToAction(WebUtility.UrlEncode(returnUrl));

,现在工作正常。

:/