使用Ninject的BindFilter <t> </t>时,同一类型的多个属性会失败

时间:2012-03-08 16:05:57

标签: asp.net-mvc-3 authorization ninject

作为启用身份的授权系统的一部分,我想使用IAuhtorizationFilter和Attributes来限制对控制器中操作方法的访问。我的工作非常顺利,部分原因是来自以下资源的帮助:

但是,当我尝试使用多个属性修饰一个动作方法时,我得到如下异常(抱歉格式化):

[InvalidOperationException: Sequence contains more than one element]

System.Linq.Enumerable.Single(IEnumerable`1 source) +2691369
   Ninject.Web.Mvc.FilterBindingSyntax.c__DisplayClass15`1.b__14(IContext ctx, ControllerContext controllerContext, ActionDescriptor actionDescriptor) in c:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax\FilterFilterBindingBuilder.cs:379
   Ninject.Web.Mvc.FilterBindingSyntax.c__DisplayClass12.b__11(IContext ctx) in c:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax\FilterFilterBindingBuilder.cs:358
   Ninject.Parameters.c__DisplayClass6.b__4(IContext ctx, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Parameters\Parameter.cs:60
   Ninject.Parameters.Parameter.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Parameters\Parameter.cs:88
   Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:97
   Ninject.Activation.Providers.c__DisplayClass2.b__1(ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81
...

这是我的代码的一个非常简化的版本,它演示了MVC3应用程序中的问题:

属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class SampleAttribute : Attribute
{
    private Guid typeId;

    public bool IsAllowed { get; set; }

    public SampleAttribute(bool IsAllowed)
    {
        this.IsAllowed = IsAllowed;

        this.typeId = new Guid();
    }

    public override object TypeId
    {
        get
        {
            return (object)typeId;
        }
    }
}

过滤

public class SampleFilter : IAuthorizationFilter, IMvcFilter
    {
        private bool isAllowed;

        public bool AllowMultiple
        {
            get { return true; }
        }

        public int Order
        {
            get { return 0; }
        }

        public SampleFilter(bool isAllowed)
        {
            this.isAllowed = isAllowed;
        }

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!isAllowed)
                throw new Exception("unauthorized");
        }
    }

控制器:

public class HomeController : Controller
    {
        [Sample(true)]
        [Sample(false)]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View();
        }
    }

如果删除了Sample方法中的Index()个属性中的一个或另一个,则上述控制器方法可以正常工作。两者都有,产生异常。我意识到在这个简化的例子中,没有一种情况需要两种属性,但它仅仅是为了说明。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

这是Ninject 2.2的已知问题。请改用3.0。

https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/ReleaseNotes.txt