Я хочу иметь возможность изменять 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;
}
}