Измените ErrorMessage на Custom ValidationAttribute, в зависимости от назначенных родительских свойств - PullRequest
0 голосов
/ 01 мая 2020

Я хочу иметь возможность изменять ErrorMessage из Custom ValidationAttribute на лету, в зависимости от назначенных родительских свойств класса свойств. Возможно ли это?

Допустим, я использую CustomModel в представлении, и при отправке я получаю сообщение об ошибке в свойстве CoursePeriode.From.Day и свойстве Birthday.Month. Вместо получения этих сообщений об ошибках:

  • День, бла-бла
  • Месяц, бла-бла

Я хочу, чтобы сообщения об ошибках были:

  • Курс Период Из Дня, бла бла
  • Месяц рождения, бла бла

Вот мой код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

public class CustomModel
{
    [DisplayName("Course Periode")]
    public DateFromAndToModel CoursePeriode { get; set; }

    [DisplayName("Birthday")]
    public DateModel Birthday { get; set; }
}

public class DateFromAndToModel
{
    [DisplayName("From")]
    public DateModel From { get; set; }

    [DisplayName("To")]
    public DateModel To { get; set; }
}

public class DateModel
{
    [Numeric(ErrorMessage = "{0}, bla bla")]
    [DisplayName("Day")]
    public int? Day { get; set; }

    [Numeric(ErrorMessage = "{0} , bla bla")]
    [DisplayName("Month")]
    public int? Month { get; set; }

    [Numeric(ErrorMessage = "{0}, bla bla")]
    [DisplayName("Year")]
    public int? Year { get; set; }
}

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class NumericAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return true;
        }
        else if (value != null || !string.IsNullOrEmpty(value.ToString()))
        {
            return int.TryParse(value.ToString(), out _);
        }

        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {           
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "numeric"
        };
        yield return rule;
    }
}
...