重定向到另一个操作时隐藏URL中的模型数据

时间:2014-04-10 03:28:03

标签: c# asp.net-mvc asp.net-mvc-4

我试图在用户登录后将模型传递给操作,但整个模型数据在URL中可见。如何从url中隐藏这些数据?

这是登录代码。

[HttpPost]
    public ActionResult SignIn(string email, string password)
    {
        try
        {
            //Input Validation.
            if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password))
            {
                ViewBag.LoginState = "ERROR";
                ViewBag.ErrorMessage = "PlayerID  Password can not be empty.";
                return View("/views/home/SignIn.cshtml");
            }

            if (true == ((LoginAPIController)this.APIController).AuthenticateUser(email, password))
            {
                Account accountDetails = ((LoginAPIController)this.APIController).GetUserDetails(email);

                HedgeUtil.UserLoginToSession(accountDetails.emailAddress, accountDetails.firstName, accountDetails.lastName);
                return RedirectToAction("UserPortal", "Home", accountDetails);
            }               
          return View("/views/home/SignIn.cshtml"); 

        }
        catch
        {
            ViewBag.LoginState = "ERROR";
            ViewBag.ErrorMessage = "Invalid UserId or Password, Please try again. Contact customer support if problem persists";
            return View("/views/home/SignIn.cshtml");
        }

    }

注意return RedirectToAction("UserPortal", "Home", accountDetails);此处accountDetails是在网址中可见的模型。

如何在url中隐藏这些数据?

3 个答案:

答案 0 :(得分:1)

我不一定同意 vishal sharma的答案。我想进一步解释。

HTTP是无状态的。这意味着每个请求都被视为一个新请求,服务器没有固有的回忆这个用户刚刚去过的地方。

当您使用RedirectToAction时,您正在将用户重定向到某个位置,因此他们会向您的服务器发出新请求。您不能只是将模型“传递”到重定向 - 用户现在所处的操作以及它们将要断开的操作是分开的。

RedirectToAction方法只能获取描述路由值的对象。

解决此问题的一种方法是使用TempData。虽然 TempData应该很少使用,但它本质上是解决这个问题的方法。

将模型放入TempData,然后重定向用户。您必须在另一侧提取TempData才能检索模型。

进一步阅读:ViewBag, ViewData and TempData

答案 1 :(得分:1)

您可以像这样在TempData中传递数据:

TempData["MyData"] = accountDetails;

并采取行动:

public ActionResult UserPortal()
{
Account accountDetails = TempData["MyData"] as Account;
}

答案 2 :(得分:0)

在MVC4中如果你观察到RedirectToAction方法有6次重载, 你在这里使用的是

protected internal RedirectToRouteResult RedirectToAction
(string actionName, string controllerName, object routeValues);

为了避免传递给url的参数,你必须使用这个重载

protected internal virtual RedirectToRouteResult RedirectToAction
(string actionName, string controllerName, RouteValueDictionary routeValues);

你可以像这样使用routevaluedictionary

                Account accountDetails = 
                ((LoginAPIController)this.APIController).GetUserDetails(email);
                RouteValueDictionary rd = new RouteValueDictionary();
                rd.Add("accoundInfo",accountDetails);
                return RedirectToAction("Index", "Home", rd);