【问题标题】:Manually validate Model in Web api controller在 Web api 控制器中手动验证模型
【发布时间】:2015-06-18 06:37:44
【问题描述】:

我有一个名为“用户”的类和一个属性“名称”

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);
}

如何手动验证 User 对象,以便 ModelState.IsValid 返回 false 给我?

【问题讨论】:

  • 为什么要手动创建User 对象?如果是模型,用户将是PostUser 方法的输入参数。您想知道如何根据数据注释指定的规则(例如[Required])验证任意对象吗?
  • 这只是一个例子。我正在关注这个教程monox.mono-software.com/blog/post/Mono/233/… 来上传文件。如果你在这里看到我们使用 var "fileUploadObj = GetFormData(result);" 得到模型数据。为了简单起见,我创建了这个问题。
  • @MuzafarKhan 您的简化示例打破了您的问题 - 如果您想验证它,您的用户应该是一个参数。
  • 所以我们不能手动验证对象?

标签: asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

您可以使用ApiController类的Validate()方法手动验证模型并设置ModelState

public IHttpActionResult PostUser()
{
    User u = new User();
    u.Name = null;

    this.Validate(u);

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

    return Ok(u);
}

【讨论】:

  • thanx...这就是我想要的:)
  • this.Validate(objectToValidate);这就是你所需要的!
  • 需要 ModelState.Clear();在验证(u)之前;还有“这个”。在这里完全没有意义
【解决方案2】:

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

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);
    }

    // ...
}

【讨论】:

  • 除非我遗漏了什么,否则这应该是对已接受答案的评论,说明在某些情况下您可能希望清除模型状态
【解决方案3】:

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

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; }
}

【讨论】:

    【解决方案4】:

    模型应该是您的 ActionMethod 的输入参数,并且 ModelState.IsValid 将根据您在 Model 类中设置的属性进行验证,在这种情况下,因为它被设置为 [Required],它将再次验证 null 值,

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2015-04-25
      • 2013-09-06
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多