使用数据注释进行模型验证的错误消息

时间:2010-05-11 19:52:14

标签: c# asp.net-mvc validation annotations data-annotations

鉴于以下类别:

using System.ComponentModel.DataAnnotations;

public class Book{
   public Contact PrimaryContact{get; set;}
   public Contact SecondaryContact{get; set;}

   [Required(ErrorMessage="Book name is required")]
   public string Name{get; set;}
}
public class Contact{
    [Required(ErrorMessage="Name is required")]
    public string Name{get; set;}
}

是否有一种干净的方式我可以使用ContactBook中的DataAnnotations的每个实例提供明确的错误消息?例如,如果PrimaryContact实例中缺少名称,则错误将显示为“需要主要联系人姓名”。

我目前的解决方案是创建一个验证服务,检查模型状态是否存在字段错误,然后删除所述错误并使用我喜欢的特定语言将其添加回来。

4 个答案:

答案 0 :(得分:38)

这是我所知道的唯一方式,但它远非干净。它涉及使用子类和MetaData类来“覆盖”错误消息。

public class Book
{
    public PrimaryContact PrimaryContact { get; set; }
    public SecondaryContact SecondaryContact { get; set; }

    [Required(ErrorMessage = "Book name is required")]
    public string Name { get; set; }
}

public class Contact
{
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
}

[MetadataType(typeof(PrimaryContactMD))]
public class PrimaryContact : Contact
{
    class PrimaryContactMD
    {
        [Required(ErrorMessage = "Primary Contact Name is required")]
        public string Name { get; set; }
    }
}

[MetadataType(typeof(SecondaryContactMD))]
public class SecondaryContact : Contact
{
    class SecondaryContactMD
    {
        [Required(ErrorMessage = "Secondary Contact Name is required")]
        public string Name { get; set; }
    }
}

答案 1 :(得分:10)

我知道这已经过时了,但为了帮助遇到此问题的其他人并像我一样偶然发现这个问题,您可能希望将CustomValidation属性用于此类属性而不是依赖在Required属性上。

CustomValidation将允许您更精细地定制验证消息到您正在验证的属性。我已经使用context.DisplayName动态显示正在验证的属性的名称,只是为了简洁,但这可以根据您的需要进一步自定义。

如果需要进一步自定义,您可以为每个单独的属性编写不同的CustomValidation处理程序,而不是像我在代码示例中那样重复使用相同的处理程序。

using System.ComponentModel.DataAnnotations;

public class Book {
    [CustomValidation(typeof(Book), "ValidateContact")]
    public Contact PrimaryContact { get; set; }

    [CustomValidation(typeof(Book), "ValidateContact")]
    public Contact SecondaryContact { get; set; }

    [Required(ErrorMessage = "Book name is required")]
    public string Name { get; set; }

    public static ValidationResult ValidateContact(Contact contact, ValidationContext context) {
        ValidationResult result = null;

        if (contact == null) {
            result = new ValidationResult(string.Format("{0} is required.", context.DisplayName));
        } else if (string.IsNullOrWhiteSpace(contact.Name)) {
            result = new ValidationResult(string.Format("{0} name is required.", context.DisplayName));
        }

        return result;
    }
}

public class Contact {
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
}

答案 2 :(得分:0)

我也在寻找答案,到目前为止我找到的内容如果你做了类似的事情:“{0}联系人名称是必需的”在错误信息中它将自动替换变量的名称。我认为有一种方法可以明确地使用这个功能。

答案 3 :(得分:0)

C#中的以下代码格式化数据注释错误和格式为单个字符串中的附加格式

  public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid == false)
            {
                if (actionContext.ModelState.IsValid) return;
                string errors = actionContext.ModelState.SelectMany(state => state.Value.Errors).Aggregate("", (current, error) => current + (error.ErrorMessage + ". "));
            }
        }
    }