条件过滤器:仅适用于从baseController继承并且是帖子的控制器)

时间:2013-09-04 13:38:11

标签: asp.net-mvc-4 action-filter ninject.web.mvc global-filter

如何为控制器继承baseController并且是帖子的所有操作应用全局过滤器?

尝试

已经使用Ninject.Web.MVC又名Ninject.Web.Mvc.FilterBindingSyntax

但我不知道如何将条件BindFilter仅用于发布。

kernel.BindFilter<ValidateJsonAntiForgeryTokenAttribute>(System.Web.Mvc.FilterScope.Action, 0).WhenControllerType<baseController>(); ...... ??

此尝试不起作用,因为我无法向BindFilter添加两个条件

Conditions Full image

1 个答案:

答案 0 :(得分:0)

我想做类似的事情。一种方法是在When()内实现多个条件。 WhenControllerType()方法只是一个调用When()并检查控制器类型的帮助器,因此您可以在自己的方法中重新实现它,并添加您需要的任何其他逻辑。

以下是Ninject如何实现WhenControllerType()

public IFilterBindingInNamedWithOrOnSyntax<T> WhenControllerType(Type controllerType)
{
    this.When((Func<ControllerContext, ActionDescriptor, bool>) ((controllerContext, actionDescriptor) => (actionDescriptor.ControllerDescriptor.ControllerType == controllerType)));
    return this;
}

由此,我们知道如何获得约束的控制器类型。

为了获得你想要的绑定,我们可以做这样的事情(未经测试):

kernel
    .BindFilter<ValidateJsonAntiForgeryTokenAttribute>(System.Web.Mvc.FilterScope.Action, 0)
    .When((controllerContext, actionDescriptor) =>
        controllerContext.HttpContext.Request.RequestType.ToLower() == "post" &&
        typeof(baseController).IsAssignableFrom(actionDescriptor.ControllerDescriptor.ControllerType));