2010-04-06 28 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... 
    } 
} 

问:这是可能的吗?有更好的解决方案吗?我绞尽脑汁,试图弄清楚如何将属性中填充的公共属性传递给控制器​​,但我无法获取它。

回答

1

您只需访问重载的OnActionExecuting()方法的ActionExecutingContext,并将其标识为public而不是private,以便您的actionfilter可以访问它。

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



     base.OnActionExecuting(filterContext); 
    } 
} 

这可能是即使通过使用自定义控制器基类从更容易的是所有的控制器将继承:

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

然后:

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

您可以使用自定义模型绑定...

我不记得为什么我用这种方法通过基本控制器方法@jfar m (这也是一个不错的选择),但它适用于我,我确实喜欢它,因为我的动作通过参数更自我描述。

MyCustomIdentityModelBinder.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; 
    } 
} 

里面的Global.asax.cs您的应用程序启动事件

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

然后只要你有一个类型的MyCustomIdentity作为动作参数,它会自动使用MyCustomIdentityModelBinder

例如,

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

HTHS,
查尔斯

相关问题