web-dev-qa-db-ja.com

DisplayNameをErrorMessage形式にする方法

私はこのようなものを持っています:

    [DisplayName("First Name")]
    [Required(ErrorMessage="{0} is required.")]
    [StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")]
    public string Name { get; set; }

次の出力が必要です。

  • 名が必要です。
  • 名の長さは10から50の間でなければなりません。

ASP.NET MVC2エラーの概要を使用している場合は機能していますですが、手動で検証しようとすると、次のようになります。

        ValidationContext context = new ValidationContext(myModel, null, null);
        List<ValidationResult> results = new List<ValidationResult>();
        bool valid = Validator.TryValidateObject(myModel, context, results, true);

結果は次のとおりです。

  • 名前が必要です。
  • 名前の長さは10から50の間でなければなりません。

どうしましたか?ありがとう。

25
goenning

まあ、やったと思います。

次のような別の属性を作成する必要がありました。

public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
    private String displayName;

    public RequiredAttribute()
    {
        this.ErrorMessage = "{0} is required";
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var attributes = validationContext.ObjectType.GetProperty(validationContext.MemberName).GetCustomAttributes(typeof(DisplayNameAttribute), true);
        if (attributes != null)
            this.displayName = (attributes[0] as DisplayNameAttribute).DisplayName;
        else
            this.displayName = validationContext.DisplayName;

        return base.IsValid(value, validationContext);
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(this.ErrorMessageString, displayName);
    } 
}

そして私のモデルは:

    [DisplayName("Full name")]
    [Required]
    public string Name { get; set; }

ありがたいことに、このDataAnnotationは拡張可能です。

11
goenning

[DisplayName]属性を使用する代わりに(またはおそらく組み合わせて)、[Display]System.ComponentModel.DataAnnotations属性を使用します。そのNameプロパティにデータを入力します。

これにより、組み込みの検証属性またはカスタム属性をValidationContextDisplayNameで使用できます。

例えば。、

[Display(Name="First Name")] // <-- Here
[Required(ErrorMessage="{0} is required.")]
[StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")]
public string Name { get; set; }
38
Sorensen