2013-12-11 3 views
0

User.Identity는 물론 컨트롤러에서 액세스 할 수 있습니다. 하지만 모든 컨트롤러에 사용자 공통 속성을 가져 오는 복사 된 방법이 있기를 원하지는 않습니다.User.Identity 및 관련 특성 - 내 컨트롤러에서 호출 할 수있는 단일 메서드로 어떻게 처리 할 수 ​​있습니까?

public class myClass 
{ 
    public void myMethod() 
    { //assume user is authenticated for the purposes of this question 
     var currentUserId = User.Identity.GetUserId();   
     var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     var currentUser = manager.FindById(currentUserId); 
     ViewBag.UserID = currentUser.Id; 
     ViewBag.favoriteColor = currentUser.favoriteColor;    
    } 
} 

모든 컨트롤러에서 액세스 할 수있는 좋은 방법은 무엇입니까? 내가 어디에 넣을 것이고 어떻게 부르겠습니까? 최선의 방법으로 그것을 작동 시키려면 어떻게해야할까요?

+0

필자는 다른 컨트롤러가 호출하는 단일 메서드로 ViewBag 변수를 설정하는 것에 대한 제목을 비롯하여 원래이 질문을 제기했습니다. 내 연구는 오늘 ViewBag 변수를 생성 한 컨트롤러 클래스에서 ViewBag 변수를 액세스 할 수 없다고 제안합니다. 초기 게시물에 대한 나의 실제 의도는 다른 컨트롤러의 단일 클래스에서 User.Identity 정보에 액세스 할 수있게하는 것이 었습니다. – Reid

답변

0

이 내 목표는 여러 컨트롤러의 외부 클래스에서 User.Identity 정보를 얻고 나는 그래서이되었다

public class HomeController : BaseController 
    { 
     //Here you can directly use User.UserId or User.favouriteColor 
    } 
+0

감사합니다. 이 시도하고 브라우저에서 노란색 페이지 오류가 : "System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다." 실제로 초기화 오버라이드 내의 코드를 지우면 같은 오류가 발생합니다. 또한 공개 YOUR_MODEL User {get; 세트; } 줄은 불필요한 것으로 보이고 유용하게 쓰이는 IPrincipal 사용자이기 때문에 유용하지는 않습니다. 어쨌든, 똑똑한 아이디어에 감사드립니다. 제가 여기서 어떤 점을 놓치고 있다면 알려주세요. – Reid

+0

코드가 재정의 된 상태에서 초기화가 끝나면 폭발이 일어납니다. 나는 User.Identity.IsAuthenticated를 Thread.CurrentPrincipal.Identity.IsAuthenticated가 아닌 코드에 넣으면 사실상 불만을 터트 린다. – Reid

0

기본 컨트롤러

public class BaseController : Controller 
    { 
     public YOUR_MODEL User{ get; set; } 
     protected override void Initialize(RequestContext requestContext) 
     { 
      if (Thread.CurrentPrincipal.Identity.IsAuthenticated) 
       { 
       var currentUserId = User.Identity.GetUserId();   
       var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
       var currentUser = manager.FindById(currentUserId); 
       User.UserID = currentUser.Id; 
       User.favoriteColor = currentUser.favoriteColor;  
       } 
     } 
    } 

컨트롤러와 컨트롤러를 ..ovveride 시도 코드는 중복되지 않습니다. 난 그냥 내놓았다 무엇

입니다 다음과 같이 (isApproved, isLockedOut 및 MEMBERID 필드는 AspNetUsers 테이블에 내 자신의 항목입니다) :

public class MyClass 
{ 
    public string getMemberID(System.Security.Principal.IPrincipal User)//Note that this is the same name as is passed in, just personal preference  
    { 

     if (User.Identity.IsAuthenticated) 
     { 
      var currentUserId = User.Identity.GetUserId(); 
      if (currentUserId == null) 
      { 
       return "0"; 
      } 
      else 
      { 
       var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
       var currentUser = manager.FindById(currentUserId); 

       if (currentUser.isApproved && !currentUser.isLockedOut) 
        return currentUser.memberID.ToString(); 
       else 
        return "0"; 
      } 
     } 
     else 
      return "0"; 
    } 
} 

그리고이 함께 컨트롤러에서 호출됩니다

string memberID = MyClass.getMemberID(User); 

원래 의도 한 매개 변수 유형을 얻는 것이 원래의 문제였습니다. 그러나 다음 코드를 실험하고 생성했습니다.

var myUser = User; 
var currentUserId = myUser.Identity.GetUserId();//Refactor: Extract Method for this line. 

그런 다음 두 번째 줄을 선택하고 Refactor를 수행했습니다. 추출 방법. 결과는 어떤 유형을 전달하고 어떻게 호출해야 하는지를 배웠습니다.