如何将模型传递给FormsAuthentication.RedirectFromLoginPage()?

时间:2012-12-19 08:18:30

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

如果用户已通过身份验证,我想将他带到“主页”页面但是使用包含用户配置文件的模型,否则,我想回复带有模型错误的同一页面。这就是我所做的:

[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视图模型传递给它,这是错误的,并会导致异常。

3 个答案:

答案 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"); }

在索引页面中使用此代码

相关问题