数据注释无法从ModelSate获取错误消息,而不是必需的

本文关键字:消息 取错误 注释 获取 ModelSate 数据 | 更新日期: 2023-09-27 18:01:22

我使用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;
    }       

My controller code

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

My Script code.

 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中,我只获得RequiredErrorMessage,而不是RangeStringLength

这里出了什么问题?

谢谢。

数据注释无法从ModelSate获取错误消息,而不是必需的

要使验证对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代码做的事情。