如果用户已通过身份验证,我想将他带到“主页”页面但是使用包含用户配置文件的模型,否则,我想回复带有模型错误的同一页面。这就是我所做的:
[HttpPost]
[AllowAnonymous]
public ActionResult Index(Login loginViewModel)
{
if (ModelState.IsValid)
{
IUserProfile userProfile = ValidateUser(loginViewModel);
if (userProfile != null)
{
FormsAuthentication.RedirectFromLoginPage(loginViewModel.UserName, loginViewModel.RememberMe);
// return View(userProfile); This obviously won't work
}
else
{
ModelState.AddModelError("InvalidCredentials", "Invalid password. Please try again.");
}
}
return View();
}
问题是,如何将视图模型(IUserProfile
)传递给Home/Index.cshtml
视图,因为我没有明确地将他重定向到主页;它是由FormsAuthentication.RedirectFromLoginPage
方法完成的。
在调用View(userProfileViewModel)
之后,我也无法调用返回FormsAuthentication.RedirectFromLoginPage
,因为如果我这样做,它会按照惯例尝试创建名为Index
的视图。 Login
控制器并尝试将UserProfile
视图模型传递给它,这是错误的,并会导致异常。
答案 0 :(得分:1)
您需要在Home控制器的Index操作中传递模型。
确实RedirectFromLoginPage只会向浏览器发送一个HTTP状态代码(302),告诉它重定向到新页面然后调用所需的操作。正是在这个行动中(在你的案例中是家庭中的索引),你必须通过你的视图模型。
答案 1 :(得分:0)
首先,你的行动应该只做一件事而且只做一件事......而不是两件事。您希望使用索引作为登录名和主页。为什么不将登录逻辑与主页逻辑分开?当您对用户进行身份验证时,将他/她重定向到Home / Index,如果登录失败则再次显示Login。接下来,不要在登录身份验证期间加载用户配置文件,而是在将用户重定向到其主页时执行此操作(主页是我的逻辑)。到达页面后,加载其配置文件并以某种方式通过会话或其他机制缓存它。
除此之外,为什么不使用FormsAuthetnication.SetAuthCookie(username, rememberMe)
代替FormsAuthentication.RedirectFromLoginPage
。创建cookie后,请致电return RedirectToAction("Index", "Home")
。在此操作中,您可以使用HttpContext.Current.User.Identity.Name
来读取用户名并将其传递给您的方法以加载配置文件。
答案 2 :(得分:-1)
试试这个
if (Session["SessionName"].ToString() != "Role")
{
return RedirectToAction("UnAuthorised", "Login");
}
在索引页面中使用此代码