Изменить значение по умолчанию «Поле {0} является обязательным» (окончательное решение?) - PullRequest
2 голосов
/ 06 декабря 2010

Добрый день!

У меня есть следующий класс ViewModel, который я использую для формы входа:

using System.ComponentModel.DataAnnotations;

...

public class UserLogin : IDataErrorInfo
{           
    [Required]
    [DisplayName("Login")]
    public string Login { get; set; }

    [Required]
    [DisplayName("Password")]
    public string Password { get; set; }

    [DisplayName("Remember Me")]
    public bool RememberMe { get; set; }

    #region IDataErrorInfo Members

    // This will be a Model-level error
    public string Error
    {
        get
        {
            if (!WebUser.CanLogin(Login, Password))
            {
                return Resources.ValidationErrors.InvalidLoginPassword;
            }
            else
            {
                return String.Empty;
            }
        }
    }

    // All is handled by DataAnnotation attributes, just a stub for interface
    public string this[string columnName]
    {
        get
        {
            return string.Empty;
        }
    }
    #endregion

}

И это в Global.asax:

DefaultModelBinder.ResourceClassKey = "BinderMessages";
ValidationExtensions.ResourceClassKey = "BinderMessages";

Файл ресурса BinderMessages.resx находится внутри App_GlobalResources, он имеет два ключа InvalidPropertyValue (который работает) и PropertyValueRequired, который не дает и выдает мне сообщение по умолчанию.

Вопрос: можно ли изменить это сообщениеили это связано с аннотациями данных?

Я нашел много сообщений об этом, но без решения.А пока я просто отступлю от этого:

[Required(ErrorMessageResourceType = typeof(Resources.ValidationErrors), ErrorMessageResourceName = "Required")] 

Ответы [ 2 ]

6 голосов
/ 06 декабря 2010

Вы можете создать пользовательский ValidationAttribute, который расширяет RequiredAttribute и устанавливает там значения. Что-то вроде:

public class MyRequiredAttribute : RequiredAttribute
{
    public MyRequiredAttribute()
    {
         ErrorMessageResourceType = typeof(Resources.ValidationErrors);
         ErrorMessageResourceName = "Required";
    }
}

Затем украсьте вашу модель с вашим пользовательским атрибутом.

Сообщение по умолчанию компилируется в сборку DataAnnotations в файле ресурсов в System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resources и имеет значение RequiredAttribute_ValidationError=The {0} field is required.. Поэтому, чтобы ответить на ваш вопрос, да, это сообщение является частью DataAnnotations.

Редактировать: PropertyValueRequired используется для ошибок в нулевых значениях с ненулевыми типами. Как упомянуто ниже, PropertyValueInvalid используется для ошибок преобразования типов.

1 голос
/ 07 декабря 2010

Я использовал подход с использованием одноэлементного класса для обеспечения переводов. Вам все еще нужно извлечь все атрибуты, как это предложено @bmancini. Преимущество моего подхода в том, что вы можете использовать несколько таблиц строк (или переключать источник перевода) без необходимости изменять какую-либо другую логику.

Поскольку моя запись в блоге довольно большая, я просто предоставлю ссылку: http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/

...