2010-04-06 3 views
0

에 속성에서 데이터를 전달 여기 내 시나리오입니다 :사용자 정의 IIdentity 및 컨트롤러

내가 성공적으로 나는 GenericPrincipal에 전달 사용자 정의 IIdentity을 만들었습니다. 내 컨트롤러에서 해당 IIdentity에 액세스 할 때 사용자 지정 속성을 사용하려면 IIdentity를 캐스팅해야합니다. 예 :

public ActionResult Test() 
{ 
    MyCustomIdentity identity = (MyCustomIdentity)User.Identity; 
    int userID = identity.UserID; 
    ...etc... 
} 

나는 거의 모든 행동이 캐스팅을 할 필요가 있기 때문에 내가 ActionFilterAttribute에서이 기능을 래핑하고 싶습니다. 컨텍스트가 아직 초기화되지 않았으므로 컨트롤러의 생성자에서이를 수행 할 수 없습니다. 내 생각은 ActionFilterAttribute가 각 동작 메서드에서 사용할 수있는 컨트롤러의 개인 속성을 채우는 것입니다. 예 :

public class TestController : Controller 
{ 
    private MyCustomIdentity identity; 

    [CastCustomIdentity] 
    public ActionResult() 
    { 
     int userID = identity.UserID; 
     ...etc... 
    } 
} 

질문 : 가능한가요? 더 나은 해결책이 있습니까? 나는 컨트롤러에 속성으로 채워진 public 속성을 전달하는 방법을 알아 내려고 노력했는데 얻을 수 없다.

답변

1

오버로드 된 OnActionExecuting() 메서드의 ActionExecutingContext에 액세스하고 private 대신 identity를 public으로 설정하면 사용자의 actionfilter가 액세스 할 수 있습니다. 다음

public class MyCustomController 
{ 
    protected MyCustomIdentity Identity { get{ return (MyCustomIdentity)User.Identity; } } 
} 

과 :

public class TestController : MyCustomController 
{ 
    public ActionResult() 
    { 
     int userID = Identity.UserId 
     ...etc... 
    } 
} 
1

당신은 사용자 정의를 사용할 수

public class CastCustomIdentity : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     ((TestController) filterContext.Controller).Identity = (MyCustomIdentity)filterContext.HttpContext.User; 



     base.OnActionExecuting(filterContext); 
    } 
} 

이에서 모든 컨트롤러가 상속 것이라고 맞춤 기반 컨트롤러 클래스를 사용하여보다 쉽게 ​​될 수있다 모델 바인더 ...

왜이 방법을 기본 컨트롤러 방법 @jfar m보다 많이 사용했는지 기억이 안납니다. (좋은 선택이기도합니다.) 그러나 그것은 내게 잘 작동하며, 실제로는 내 행동이 매개 변수를 통해 더 잘 설명되기 때문에 실제로 좋아합니다. 당신이 작업 매개 변수로 MyCustomIdentity의 유형있을 때마다

MyCustomIdentityModelBinder.cs Global.asax.cs에서 응용 프로그램 시작 이벤트 내부

public class MyCustomIdentityModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.Model != null) 
      throw new InvalidOperationException("Cannot update instances"); 

     //If the user isn't logged in, return null 
     if (!controllerContext.HttpContext.User.Identity.IsAuthenticated) 
      return null; 

     return controllerContext.HttpContext.User as MyCustomIdentity; 
    } 
} 

System.Web.Mvc.ModelBinders.Binders.Add(typeof(MyCustomIdentity), new MyCustomIdentityModelBinder()); 

다음, 자동으로 사용합니다 MyCustomIdentityModelBinder.

예 :

public class TestController : Controller 
{ 
    public ActionResult Index(MyCustomIdentity identity) 
    { 
     int userID = identity.UserID; 
     ...etc... 
    } 
} 

HTHs,
찰스

관련 문제