最近,我决定在控制器中删除一堆动作级别过滤器,并用一个控制器级过滤器替换它们。
现在我收到此错误消息。
Error activating LogActionFilter More than one matching bindings are available. Activation path: 1) Request for LogActionFilter Suggestions: 1) Ensure that you have defined a binding for LogActionFilter only once.
我确定错误与动作过滤器被绑定两次有关,因为那是我改变的。但是,当我查看文档here时,我可以看到它指定/做同样的事情。所以我真的不确定我做错了什么。
我的样本控制器
[LogAction]
public class SomeController : Controller
{
public ActionResult SomeAction()
{
}
}
我的注册码
public static void RegisterFilters()
{
Kernel.BindFilter<LogActionFilter>(FilterScope.Controller, 0)
.WhenControllerHas<LogActionAttribute>();
Kernel.BindFilter<LogActionFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<LogActionAttribute>();
}
答案 0 :(得分:4)
如果您的控制器及其某个操作同时具有LogActionAttribute,则会发生这种情况。
答案 1 :(得分:3)
(我知道答案已被接受,但这是为了记录。)
如果您只能使用发布版本,临时解决方案是创建两个子类并单独注册它们。以下是我的申请中的一个例子:
public class MyAuthorizationFilter : IAuthorizationFilter
{
/* call base ctor */
}
public class MyControllerAuthorizationFilter : MyAuthorizationFilter
{
/* call base ctor */
}
public class MyActionAuthorizationFilter : MyAuthorizationFilter
{
}
然后设置过滤器绑定:
this.BindFilter<MyControllerAuthorizationFilter>(FilterScope.Controller, 0)
.WhenControllerHas<MyAttribute>()
.WithConstructorArgumentFromControllerAttribute<ProtectedAttribute>(/*...*/) ;
this.BindFilter<MyActionAuthorizationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<MyAttribute>()
.WithConstructorArgumentFromActionAttribute<ProtectedAttribute>(/*...*/) ;
确保调用正确的'WithConstructorArgumentFrom [控制器/操作]属性方法,否则你会得到'序列没有元素'错误(我做过)。
答案 2 :(得分:1)
更好的解决方法。实际上我也在新版本中使用它,而不是为控制器和动作设置两个绑定。
this.BindFilter<MyFilter>(FilterScope.Global, int.MinValue)
.When((controllerContext, actionDescriptor) =>
controllerContext
.Controller
.GetType()
.GetCustomAttributes(typeof(MyAttribute),true)
.Length > 0
|| actionDescriptor.GetCustomAttributes(typeof(MyAttribute), true).Length > 0);