【问题标题】:Exclude "The value 'null' is not valid for ..." in ActionFilterAttribute在 ActionFilterAttribute 中排除“值 'null' 对 ... 无效”
【发布时间】:2017-08-03 20:49:00
【问题描述】:

在一个 webapi 项目中,我们有一个类似的模型:

public class Person
{
    public string Name { get; set; }

    public Guid? Id { get; set; }
}

我们已经配置了参数验证,并使用 ActionFilterAttribute 进行了一些检查:

public class ModelActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        (...)
        var modelState = actionContext.ModelState;
        if (modelState.IsValid == false)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }

        base.OnActionExecuting(actionContext);
    }
}

问题在于,执行如下调用:https://localhost/person?Id=null&name='John',会产生如下错误:

The value 'null' is not valid for Id.

我们首先使 Id 字段可以为空,因为我们希望允许像上面那样的调用。尽管如此,验证者还是会抱怨。有什么干净的方法可以排除这个错误吗?

我可以遍历错误列表并排除这个错误,但感觉真的不对。

【问题讨论】:

  • https://localhost/person?Id=null&name='John' 这样的请求的目的是什么?我希望请求是:https://localhost/person?name=John,应该可以正常工作,对吧?
  • 您不能将文本“null”分配给int。只需省略 id 查询字符串,id 的值将是 null
  • 它是 guid?,而不是 int。此外,问题很明确,并不是要从调用中省略该变量。

标签: c# asp.net-mvc fluentvalidation actionfilterattribute fluentvalidation-2.0


【解决方案1】:

您可以定义特定于目的的模型。例如:

public class PersonSearchParameters
{
    public string Name { get; set; }

    public string Id { get; set; }
}

然后让您的方法以您喜欢的方式处理解析Id

我真的认为这会更容易,不过,如果你只是说如果你希望它为空,应该从结果中省略 id

【讨论】:

  • 这可能会奏效,尽管它更像是一种解决方法。
  • @Cyan:尝试创建某种异常以使 "null" 等同于 null 将是一种解决方法——您将创建一个 hack 以适应发送非标准查询的客户端服务器的语法。我的建议是试图避免需要解决方法。听起来您使用Person 类来表示不是Person 的东西,这迫使您通过没有真正意义的更改来破坏您的模型(即真正的“人”应该有一个非空 ID,对吧?)。
猜你喜欢
  • 2015-12-21
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多