数据注释无法从ModelSate获取除Required之外的错误消息

时间:2014-05-02 09:00:39

标签: c# data-annotations

我正在使用Data Annotation进行服务器端验证,并从客户端将数据发送到控制器,然后从ModelState我尝试获取ErrorMessage

我的代码。

[Required(ErrorMessage = "Order ID cannot be null")]
    [Range(0, int.MaxValue, ErrorMessage = "OrderID must be greater than 0.")]
    public int OrderID
    {
        get;
        set;
    }
    [Required]//(ErrorMessage = "Customer ID cannot be null")]
    [StringLength(5, ErrorMessage = "CustomerID must be 5 characters.")]
    public string CustomerID
    {
        get;
        set;
    }       

我的控制器代码

public ActionResult Validate(EditableOrder order)
    {
        if (!ModelState.IsValid)
        {
            List<string> errorlist = new List<string>();
            foreach (ModelState modelState in ModelState.Values)
            {
                foreach (ModelError error in modelState.Errors)
                {
                    errorlist.Add(error.ErrorMessage);
                }
            }
            return Content(new JavaScriptSerializer().Serialize(errorlist));
        }
        return Content("true");
    }

我的脚本代码。

 var record = args.data;
        $.ajax({
            url: "/Inlineform/Validate",
            type: "POST",
            data: record,
            success: function (data) {
                var errorlist = JSON.parse(data);
                var i;
                if (errorlist.length)
                {
                    args.cancel = true;
                    var str="";
                    $.each(errorlist,function(index,error){
                        str+="<tr><td>"+error+"</td></tr>";
                    });
                    $("#ErrorList").html("<table>"+str+"</table>");
                }
            }

当对Validate操作发出请求时,我可以将其与EditableOrder绑定,而在ModelState中我只能获得ErrorMessage的{​​{1}}而不是Required {1}}或Range

这里出了什么问题?

感谢。

1 个答案:

答案 0 :(得分:0)

要使验证对MVC2有效,您必须将以下代码放在包含需要验证的字段的页面上:

    <script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
    <script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
    ...
    @Html.EnableClientValidation();

此外,使用StringLength将不适用于最小长度。 MVC中StringLength的默认适配器是:

    public class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>
    {
      public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute): base(metadata, context, attribute)
      {}
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
      {
        return new[] { new ModelClientValidationStringLengthRule(ErrorMessage, 0, Attribute.MaximumLength) };
      }
    }

在撰写此代码时,有人在微软休息了一天。

您可以使用以下方法覆盖StringLength适配器以使其正常运行:

    public class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>
    {
      public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute): base(metadata, context, attribute)
      {}
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
      {
        return new[] { new ModelClientValidationStringLengthRule(ErrorMessage, Attribute.MinimumLength, Attribute.MaximumLength) };
      }
    }

最后,将此代码放入global.asax.cs文件中:

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthAttribute), typeof(MVCWebPractice.Models.StringLengthAttributeAdapter));

这解决了StringLength的问题。您不需要创建任何客户端javascript来实现任何此类。

要在特定部分打印错误摘要,请将其放在视图上的适当位置:

    <%: Html.ValidationSummary(false) %>

您需要将标志设置为false以显示与属性值相关的错误。我假设这是您尝试使用自定义JavaScript代码。

我希望这会有所帮助。