Скрыть основное имя свойства в сообщении об ошибке проверки аннотации данных - PullRequest
2 голосов
/ 05 мая 2019

У меня есть модель ядра asp.net:

public class MyModel
{
    [ModelBinder(Name = "id")]
    [StringLength(36, MinimumLength = 3)]
    public string ObjectId { get; set; }
}

Я добавил атрибут ModelBinder, чтобы переименовать поле «ObjectId» в «id».

Когда япытаясь представить модель с плохими значениями.Например:

{
    "id": "1111111111111111111111111111111111111111111111111111111111111111111111111111"
}

Я получаю ответ от сервера:

{
     "id":["The field ObjectId must be a string with a minimum length of 3 and a maximum length of 36."]
}

Ожидаемый результат:

{
     "id":["The field id must be a string with a minimum length of 3 and a maximum length of 36."]
}

Это странно, потому что key («id») было написано в правильном случае.Но в value («ObjectId») это было написано неправильно.

Мой клиент не должен знать о ObjectId.Он просто знает id.Как исправить подобные сообщения?

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Решением является использование атрибута DisplayName:

public class MyModel
{
  [ModelBinder(Name = "id")]
  [StringLength(36, MinimumLength = 3)]
  [DisplayName("id")]
  public string Id {get; set;}
}
0 голосов
/ 07 мая 2019

Для StringLength используется имя свойства по умолчанию для построения ожидаемого сообщения об ошибке.

Если вы предпочитаете использовать Name arugment от ModelBinder, вы можете реализовать свой собственный StringLength атрибут как

public class CustomStringLength : StringLengthAttribute
{
    public CustomStringLength(int maximumLength) 
        : base(maximumLength)
    {
    }
    public override string FormatErrorMessage(string name)
    {

        return base.FormatErrorMessage(name);
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var propertyName = validationContext.DisplayName;
        var propertyAttribute = validationContext.ObjectType
                                    .GetProperty(propertyName)
                                    .GetCustomAttribute(typeof(ModelBinderAttribute));
        if (propertyAttribute is ModelBinderAttribute modelBinderAttribute)
        {
            validationContext.DisplayName = modelBinderAttribute.Name;
        }
        //validationContext.DisplayName = "Id";
        return base.IsValid(value, validationContext);
    }
}

Затем использовать его как

public class MyModel
{
    [ModelBinder(Name = "id")]
    [CustomStringLength(36, MinimumLength = 3)]
    public string ObjectId { get; set; }
}
0 голосов
/ 05 мая 2019

Пользовательское сообщение об ошибке можно установить для StringLengthAttribute Class .

public class MyModel
{
    [ModelBinder(Name = "id")]
    [StringLength(36, MinimumLength = 3, ErrorMessage="The field id must be a string with a minimum length of {1} and a maximum length of {2}.")]
    public string ObjectId { get; set; }
}

Выдержка из страницы документации:

Вы можете использовать составные заполнители форматирования в сообщении об ошибке : {0} - это имя свойства; {1} - максимальная длина; и {2} - минимальная длина. Заполнители соответствуют аргументам, которые передаются методу String.Format во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...