3

最近我决定删除控制器中的一堆动作级别过滤器,并用单个控制器级别过滤器替换它们。

现在我收到此错误消息。

激活 LogActionFilter 时出错
有多个匹配的绑定可用。
激活路径:
 1) 请求 LogActionFilter

建议:
 1) 确保您只为 LogActionFilter 定义了一次绑定。

我确定该错误与绑定两次的动作过滤器有关,因为这就是我所做的更改。但是,当我在这里查看文档时,我可以看到它指定/执行相同的操作。所以我真的不确定我做错了什么。

我的示例控制器

[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>();
}
4

3 回答 3

4

如果您的控制器及其操作之一同时具有 LogActionAttribute,则会发生这种情况。

于 2011-05-04T12:43:05.900 回答
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[ Controller/Action ]Attribute 方法,否则你会得到一个 'Sequence has no elements' 错误(我做到了)。

于 2012-01-10T21:51:51.997 回答
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);
于 2012-07-18T15:27:26.953 回答