C# 根据HTTP谓词设置必填字段

C# 根据HTTP谓词设置必填字段,c#,validation,asp.net-web-api,C#,Validation,Asp.net Web Api,是否可以设置可选的[Required]属性,适用于修补程序或PUT。我有以下代码,但无论控制器调用什么,它总是必需的 public class Car { [DataMember(Order = 0)] public string CarId { get; set; } [DataMember(Order = 1)] [Required] public string IsIncluded { get; set; } } 控制器 [HttpPatch] p

是否可以设置可选的[Required]属性,适用于修补程序或PUT。我有以下代码,但无论控制器调用什么,它总是必需的

public class Car
{
    [DataMember(Order = 0)]
    public string CarId { get; set; }
    [DataMember(Order = 1)]
    [Required]
    public string IsIncluded { get; set; }
}
控制器

[HttpPatch]
public HttpResponseMessage PatchCar(Car car)
{
    // check if submitted body is valid
    if (!ModelState.IsValid)
    {
        // Something is bad!
    }
}
我想要的是如下的东西

public class Car
{
    [DataMember(Order = 0)]
    public string CarId { get; set; }
    [DataMember(Order = 1)]
    [Required(Patch = True, Put = False]
    public string IsIncluded { get; set; }
}
然后,我的ModelState将考虑到这一点


我曾考虑为每个动作(动词)创建单独的派生类,但代码很快变得异常冗长。

这是使用数据注释进行验证的缺点之一,不幸的是,它们不能有条件地添加

你有很多选择

  • 为每个谓词创建单独的模型(或视图模型)
  • 调查一下这样的事情。。它将required扩展为IfRequired,并将条件验证添加到数据注释中。(我想你需要自己滚,这可能会变得笨拙!)

  • 尝试类似FluentValidation的方法。 (这可能是一个很好的选择,具体取决于您的应用程序要求)


  • 希望这有帮助

    谢谢你花了一天的时间来解决这个问题,我决定使用FluentValidation。看来效果不错。