使用ajax和json数据进行ModelState.IsValid验证

时间:2016-01-28 22:24:58

标签: jquery json ajax asp.net-web-api

我有以下代码段。最终,我试图让ModelState显示有效= false。现在它说有效=真。

Ajax代码:

        $(':input', '#intform').each(function () {
            frmData[this.id] = this.value;
        });

        var DTO = { 'frmData': frmData };

        $.ajax({
            url: url,
            dataType: 'json',
            contentType: 'application/json',
            type: 'POST',
            data: JSON.stringify(DTO)
        })

webAPI控制器:

 public Object Post([FromBody]JObject data)
        dynamic json = data;
        frmData item = new frmData()
        {
             Subject = "Loan Request Received", 
             Body = "The following loan request has been received:",
             BName = json.frmData.BName,
             BType = json.frmData.BType,
             ...
        }

型号:

public class frmData
{
    [LookupValueValidation(maxLength = 50, required = true)]
    public string BName  
    {
        get { return _bName; }
        set { _bName = AntiXssEncoder.HtmlEncode(value,true); }
    }
}

我想在webApi控制器中使用此构造:

        if (!ModelState.IsValid || data == null)
        {
            throw new Exception();
        }

但是,如果我为BName输入100个字符,ModelState会说它是有效的= true。我希望它是假的。我感觉我如何将数据作为JSON对象之间存在脱节,但我并不是100%肯定。

1 个答案:

答案 0 :(得分:0)

@Stryner提到Validator.TryValidateObject为我工作:

var isValid = Validator.TryValidateObject(item, new ValidationContext(item, null, null), errors, true);

我设置了ValidationResult列表以捕获任何错误:

var errors = new List<ValidationResult>();

我能够使用这个结构遍历任何错误:

foreach(ValidationResult vr in errors){
    vrMessage.Add(vr.ErrorMessage.ToString());
    return Json(new { fail = vr.ErrorMessage.ToString() });
}

ValidationResult循环有点笨拙,可能需要修改,但我只需要为此应用程序返回第一个错误,因此我将其保留为当前状态。