具有未知数量的URL变量的RedirectToAction

时间:2012-05-20 00:19:01

标签: c# asp.net-mvc-3 query-string redirecttoaction

如果你知道我想做的更好的方法,请告诉我。

所以,我在我的布局(又名MasterPage)中登录,这样无论用户在哪个页面上,用户都可以登录。 (我想确保这一点)因此,在他们成功登录后,我想将它们重定向回他们所在的页面。我使用Request.UrlReferrer.AbsoluteUri来获取URI并解析出Controller名称和Action名称。一个长的Action名称是未知数量的URL变量,可能是none,可能很多。因此,MVC3不喜欢Action名称中传递的变量。我在代码的其他部分做了这个:

return RedirectToAction("Message", new { msg = "error" });

但是,就像我说的那样,我不知道会有多少变量,也不知道变量的名称。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这是我的登录帖子操作。如果没有这样的网址,它会重定向到用户所在的最后一页或主页

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (MembershipService.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

这部分是你需要的

        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }

答案 1 :(得分:1)

我找到了一个很好的方法来做到这一点。由于我已经在解析URI,我可以获取变量和值,然后将它们添加到

RouteValueDictionary queryString = new RouteValueDictionary();

然后我可以传递给:

return RedirectToAction(action, queryString);
相关问题