了解ActionFilterAttribute检查Null

时间:2014-07-24 07:21:17

标签: c# asp.net

我正在尝试理解这个ActionFilterAttribute。我试着用一些代码来更好地理解它是如何工作的,但我完全迷失了。

这是有效的ActionFilterAttribute。它应该检查一个空请求体并返回一个错误:

public class CheckModelForNullAttribute : ActionFilterAttribute
{
    private readonly Func<Dictionary<string, object>, bool> _validate;

    public CheckModelForNullAttribute() : this(arguments => arguments.ContainsValue(null))
    { }

    public CheckModelForNullAttribute(Func<Dictionary<string, object>, bool> checkCondition)
    {
        _validate = checkCondition;
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (_validate(actionContext.ActionArguments))
        {
            var modelState = new ModelStateDictionary();
            modelState.AddModelError("Parameter", "The request body cannot be null");
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }
    }
}

为什么这不会产生相同的结果:

public class CheckModelForNullAttribute: ActionFilterAttribute
{
    private readonly Func<Dictionary<string, object>, bool> _validate = args => args.ContainsValue(null);

    public override void OnActionExecuting(HttpActionContext filterContext)
    {
        if (!_validate(filterContext.ActionArguments))
        {
            filterContext.ModelState.AddModelError("Parameter", "The request body cannot be null");
            filterContext.Response = filterContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, filterContext.ModelState);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我的愚蠢错误:

if (_validate(actionContext.ActionArguments)) 

在第一堂课

if (!_validate(filterContext.ActionArguments)) 

在第二节课。

解决方案,删除!它的工作方式相同。

谢谢haim770的暗示!猜猜我累了,看不到那个