2012-12-19 67 views
1

如果用户通过验证后,我要带他到“家”的页面,但与包含用户配置文件的模型,否则,我要发布回相同的页面与模型的误差。下面是我做了什么:如何将模型传递给FormsAuthentication.RedirectFromLoginPage()?

[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方法完成。

我也不能拨打电话到FormsAuthentication.RedirectFromLoginPage后返回View(userProfileViewModel),因为如果我这样做,它会,按照惯例,尝试Login控制器上的名称Index创建视图,并会尝试通过它的UserProfile视图模型,这是错误的,并会导致异常。

回答

1

您需要通过模型在主页控制器的索引操作。

事实上,RedirectFromLoginPage将只发送一个HTTP状态代码(302)到浏览器,告诉它重定向到新的页面,然后调用所需的操作。它是在这个动作中(在你的情况下索引在家中),你必须通过你的视图模型。

+0

一种方法是把USERPROFILE在会话对象,然后在HomeController.Index(),加载从会话配置文件,并把它传递给视图。 但是,如果你的建议,我需要通过模型到HTTPGET HomeController.Index(Models.UserProfile USERPROFILE),我该怎么办呢? –

+0

@Water Cooler v2您可以通过调用User.Identity.Name来记录您的Index操作中的UserProfile。 – Gregoire

-1

试试这个

if (Session["SessionName"].ToString() != "Role") { return RedirectToAction("UnAuthorised", "Login"); }

使用此代码在您的索引页

0

首先,你的行动应该做的一两件事,只有一件事......而不是两个。你想使用索引作为登录和主页。你为什么不将登录逻辑与主页逻辑分开?当您认证用户将他/她重定向到Home/Index时,并且如果登录失败,请再次登录。接下来,不要在登录验证期间加载用户配置文件,而是在将用户重定向到他们的主页时进行此操作(主页是我的逻辑)。一旦你到达页面,加载他们的配置文件并以某种方式通过会话或其他机制来缓存它。

除了这个,你为什么不使用FormsAuthetnication.SetAuthCookie(username, rememberMe),而不是FormsAuthentication.RedirectFromLoginPage。一旦创建cookie,请致电return RedirectToAction("Index", "Home")。在此操作中,您可以使用HttpContext.Current.User.Identity.Name来读取用户名并将其传递给您的方法以加载配置文件。我能想到这样做