2011-12-25 20 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

相關問題