我试图在用户登录后将模型传递给操作,但整个模型数据在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中隐藏这些数据?
答案 0 :(得分:1)
我不一定同意 vishal sharma的答案。我想进一步解释。
HTTP是无状态的。这意味着每个请求都被视为一个新请求,服务器没有固有的回忆这个用户刚刚去过的地方。
当您使用RedirectToAction
时,您正在将用户重定向到某个位置,因此他们会向您的服务器发出新请求。您不能只是将模型“传递”到重定向 - 用户现在所处的操作以及它们将要断开的操作是分开的。
RedirectToAction方法只能获取描述路由值的对象。
解决此问题的一种方法是使用TempData
。虽然 TempData应该很少使用,但它本质上是解决这个问题的方法。
将模型放入TempData,然后重定向用户。您必须在另一侧提取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);