2011-12-25 69 views
3

用户登录到系统后,我需要在Session中放置一个变量。我与扩展方法这样做:如何获取User.Identity在控制器外的类中工作

登录方法:

[HttpPost] 
     public ActionResult LogOn(LogOnModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (Membership.ValidateUser(model.UserName, model.Password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

        int id = this.HttpContext.GetFirmaId(); 
        String username = this.HttpContext.User.Identity.Name; 

        //SessionExtensions.SetFirmaId(Session, model.UserName); 

        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
         && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         if (User.IsInRole("Administrator")) 
         { 
          RedirectToAction("Index", "Admin"); 
         } 
         else 
         { 
          return RedirectToAction("Index", "Home"); 
         } 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "Brugernavn eller password er forkert."); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 

扩展方法:

public static int GetFirmaId(this HttpContextBase context) 
    { 

     var firmaid = context.Session["firmaid"] as int?; 

     if (firmaid == null) 
     { 
      // Hvis firmaid er røget ud af Session, skal den firmaid som tilhører brugeren hentes 

      firmaid = SetFirmaId(context.Session, context.User.Identity.Name); 

     } 

     return (int)firmaid; 
    } 

的问题是,context.User.Identity.Name返回一个空字符串。

我该如何解决这个问题?

+1

你打电话给它?你为什么不扩展'HttpContextBase'? – SLaks 2011-12-25 21:01:51

+0

我在我用作帮手的静态类中调用它。我如何使用HttpContextBase?它有Equals和ReferenceEquals方法。 – Kenci 2011-12-25 21:04:03

+1

将它作为参数而不是'HttpSessionStateBase'。 – SLaks 2011-12-25 21:05:44

回答

0

尝试

public static int GetFirmaId(this HttpContextBase context) 
     { 

      var firmaid = context.Session["firmaid"] as int?; 

      if (firmaid == null) 
      { 
       // Hvis firmaid er røget ud af Session, skal den firmaid som tilhører brugeren hentes 

       firmaid = SetFirmaId(context.Session, context.User.Identity.Name); 

      } 

      return (int)firmaid; 
     } 

UPDATE - 按照注释:使用它,就像this.HttpContext.GetFirmaId()从您的控制器。

一些有用的链接:

更新2 - 按评论:

的是的问题与问题没有关系 - 上面的答案是在控制器之外的类中访问它的方法。

由于OP在调试器中看到它在控制器中甚至是空的,在这种情况下 - 我怀疑它在进程中“太早”被访问,所以它确实是空的。

如果您在处理AccountController时需要帮助,请提出一个新问题。

+0

从哪里我将能够使用HttpContext.Current.GetFirmaId()?它不显示在我的控制器中。当从控制器调用GetFirmaId时,VS说它需要一个参数。 – Kenci 2011-12-25 21:21:21

+0

@Kenci在上面看到我的更新。 – Yahia 2011-12-25 21:26:10

+1

@Kenci:'HttpContext.GetFirmaId()'。 ('HttpContext'是一个返回'HttpContextBase'实例的属性)你需要理解扩展方法是如何工作的。 – SLaks 2011-12-25 21:27:08

相关问题