Asp.net 在Web api控制器中手动验证模型

Asp.net 在Web api控制器中手动验证模型,asp.net,asp.net-mvc,asp.net-web-api,Asp.net,Asp.net Mvc,Asp.net Web Api,我有一个名为“User”的类和一个属性“Name” public class User { [Required] public string Name { get; set; } } api控制器方法是 public IHttpActionResult PostUser() { User u = new User(); u.Name = null; if (!ModelState.IsValid) return B

我有一个名为“User”的类和一个属性“Name”

public class User
{
    [Required]
    public string Name { get; set; }
}
api控制器方法是

public IHttpActionResult PostUser()
{

       User u = new User();
       u.Name = null;

        if (!ModelState.IsValid)
        return BadRequest(ModelState);

        return Ok(u);
}

如何手动验证用户对象,以便ModelState.IsValid向我返回false?

该模型应该是ActionMethod的输入参数,并且ModelState.IsValid将根据您在模型类中设置的属性进行验证,在这种情况下,当它设置为[必需]时,它将根据空值进行验证

如果您只想手动检查是否有值,可以直接检查

if (user.Name == null) {
  return;
}

您需要将自定义验证属性定义为

class CustomValidatorAttribute : ValidationAttribute
{
  //custom message in ctor
  public CustomValidator() : base("My custom message") {}
  public CustomValidator(string Message) : base(Message) {}
  public override bool IsValid(object value)
  {
     return !string.IsNullOrWhiteSpace(value.ToString());
  }
  //return a overriden ValidationResult
  protected override ValidationResult IsValid(Object value,ValidationContext validationContext)
  {
     if (IsValid(value)) return ValidationResult.Success;
     var message = "ohoh";
     return new ValidationResult(message);
  }
 }
同样在你的模型课上

public class User
{
  [Required]
  [CustomValidator("error")]
  public string Name { get; set; }
}
您可以使用类的方法手动验证模型并设置


此答案不适用于这种情况,但如果您想手动验证参数,则此答案非常相关:

public IHttpActionResult Post(User user)
{
    ModelState.Clear(); // remove validation of 'user'
                        // validation is done automatically when the action
                        // starts the execution

    // apply some modifications ...

    Validate(user); // it adds new keys to 'ModelState', it does not update any keys

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    // ...
}

为什么要手动创建
User
对象?如果是模型,用户将成为
postaser
方法的输入参数。您想知道如何根据数据注释指定的规则(例如,
[Required]
)验证任意对象吗?这只是一个示例。我正在按照这个toturial上传一个文件。如果你看到这里,我们使用var“fileUploadObj=GetFormData(result);”得到模型数据。为了简单起见,我创建了这个问题。@muzafarkan您的简化示例打破了您的问题-如果您想验证它,您的用户应该是一个参数。所以我们不能手动验证对象?thanx…这就是我想要的:)this.validate(objectToValidate);这就是你所需要的!需要ModelState.Clear();验证前(u);此外,“this.”在这里完全没有意义,除非我遗漏了什么,否则这应该是对已接受答案的评论,在某些情况下,您可能希望清除模型状态
public IHttpActionResult Post(User user)
{
    ModelState.Clear(); // remove validation of 'user'
                        // validation is done automatically when the action
                        // starts the execution

    // apply some modifications ...

    Validate(user); // it adds new keys to 'ModelState', it does not update any keys

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    // ...
}