理解ActionFilterAttribute检查空值

3
我正在尝试理解这个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
修改后的版本是否进入了 if !_validate() 块? - haim770
哦,原来是这样。如果你看第一个是if _validate(),而第二个是!_validate()。一个有真条件,另一个则是非真条件。你真是个天才!我已经困惑地看了这两个类10个小时,该死,那是一个愚蠢的错误。 - user1848850
1个回答

2

我犯了一个愚蠢的错误:

if (_validate(actionContext.ActionArguments)) 

在第一类中

if (!_validate(filterContext.ActionArguments)) 

在第二类中。

解决方案是去掉感叹号,它的作用是相同的。

感谢haim770的提示!我猜我当时太累了,没能看到那个感叹号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接