【问题标题】:Redirect To Action with parameter values within controller使用控制器内的参数值重定向到操作
【发布时间】:2019-11-14 22:55:41
【问题描述】:

场景

我有一个身份验证控制器,用于授权用户和管理员凭据以及注册新用户。当发现用户已经存在时,我想将控制器重新路由到我在控制器中声明的重载操作,将字符串作为路由值传递给该操作。但是,目前这似乎不起作用。

AuthController.cs

    [HttpGet]
    public IActionResult Register()
    {
        ViewData["Title"] = "Registration";

        return View(new RegisterViewModel());
    }

    public IActionResult Register(string caption)
    {
        ViewData["Title"] = "Registration";

        ViewBag.caption = caption;

        return View(new RegisterViewModel());
    }

    [HttpPost]
    public async Task<IActionResult> Register(RegisterViewModel vm)
    {
        if (!ModelState.IsValid)
            return View(vm);

        var user = new IdentityUser
        {
            UserName = vm.Email,
            Email    = vm.Email
        };

        var result = await _userManager.CreateAsync(user, "password");

        if (result.Succeeded)
        {
            // !> Initial Registration!
            await _signInManager.SignInAsync(user, false);
            return RedirectToAction("Index", "Home");
        }

        return RedirectToAction("Register", "Auth", "This user is currently configured with a password");
    }

问题

目前如果我使用以下重定向:

    return RedirectToAction("Register", "Auth", "This user is currently configured with a password");

它转到第一个,或者这个动作:

    public IActionResult Register()
    {
        ViewData["Title"] = "Registration";

        return View(new RegisterViewModel());
    }

而不是第二个,或者这个动作:

    public IActionResult Register(string caption)
    {
        ViewData["Title"] = "Registration";

        ViewBag.caption = caption;

        return View(new RegisterViewModel());
    }

不太确定我是否正确处理了这个问题。任何意见或建议都将不胜感激。

【问题讨论】:

  • 您正在执行重定向,因此您正在发出 GET 请求,这就是它调用第一个请求的原因。

标签: c# asp.net-mvc asp.net-core controller


【解决方案1】:

我认为这是错误的:

return RedirectToAction("Register", "Auth", "This user is currently configured with a password");

您需要提供一个包含参数的对象,而不是字符串。 字符串仅用于定义 url 片段 (https://en.wikipedia.org/wiki/Fragment_identifier)。

https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.controller.redirecttoaction?view=aspnet-mvc-5.2

你可以试试:

return RedirectToAction("Register", "Auth", new { caption = "This user is currently configured with a password"});

【讨论】:

  • 谢谢!正是我想要的。感谢您的澄清!
【解决方案2】:

你可以试试下面的语法::

[带参数的RedirectToAction]

return RedirectToAction("Action","controller",new {@id=id});

【讨论】:

    【解决方案3】:

    您可以自定义ActionMethodSelectorAttribute,如下所示:

    public class RequireRequestValueAttribute : ActionMethodSelectorAttribute
    {
        public RequireRequestValueAttribute(string valueName)
        {
            ValueName = valueName;
        }
    
        public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
        {
            bool contains = false;
            contains = routeContext.HttpContext.Request.Query.ContainsKey(ValueName);   
            return contains;
        }
    
        public string ValueName { get; private set; }
    }
    

    用于测试:

    [HttpGet]
    public IActionResult Register()
    {
        return View();
    }
    [HttpGet]
    [RequireRequestValue("caption")]
    public IActionResult Register(string caption)
    {
        ViewData["Title"] = "Registration";
    
        ViewBag.caption = caption;
    
        return View();
    }
    [HttpPost]
    public async Task<IActionResult> Register()
    {
        return RedirectToAction("Register", "Account", new { caption = "This user is currently configured with a password" });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多