Подтвердить что ты не робот

Где весь список сообщений об ошибках по умолчанию для DataAnnotations в MVC 3

Еще один вопрос о локализации MVC...

Я пытаюсь локализовать приложение ASP.Net MVC 3, используя локализованные файлы ресурсов, чтобы отображать тексты в представлениях, как рекомендовано.

Проблема, как обычно, заключается в попытке локализовать сообщения об ошибках по умолчанию из аннотаций данных.

Я знаю, что вы можете указать файл ресурсов и ключ в каждом атрибуте:

[Required(
ErrorMessageResourceType = typeof(CustomResourceManager), 
ErrorMessageResourceName = "ResourceKey")]
public string Username { get; set; }

и даже, что лучше и предпочтительнее, вы можете переопределить сообщение по умолчанию, например: Ресурс по умолчанию для аннотаций данных в ASP.NET MVC, так что вы можете оставьте атрибуты как:

[Required]
public string Username { get; set; }

Этот последний подход - это тот, который я выполнял, и он работает, но только тогда, когда DataAnnotation, которую вы хотите переопределить, имеет сообщение ONE и ONLY ONE, поскольку оно всегда ищет ключ ресурса, называемый так же, как и атрибут в пользовательский файл ресурсов (например, "Обязательный" ) нуждается в записи "RequiredAttribute" в файле ресурсов)

Другие атрибуты, такие как StringLength, содержат более одного сообщения об ошибке, в зависимости от параметров, которые вы используете. Итак, если у вас есть модель, например:

public class Person
{
    [Required]
    [StringLengthLocalizedAttribute(10, MinimumLength = 5)]
    [Display(Name = "User name")]
    public string UserName { get; set; }
}

Сообщение об ошибке " Поле Имя пользователя должно быть строкой с минимальной длиной 5 и максимальной длиной 10."

И если вы измените атрибут StringLength на:

    [StringLengthLocalizedAttribute(10)]

сообщение об ошибке изменяется на " Поле" Имя пользователя "должно быть строкой с максимальной длиной 10." Итак, в этом случае есть по крайней мере 2 сообщения об ошибках по умолчанию для переопределения и решения, выданные @kim-tranjan, терпят неудачу.

Мое частичное решение этого - реализовать собственный атрибут StringLength, например:

public class StringLengthLocalizedAttribute : StringLengthAttribute
{
    public StringLengthLocalizedAttribute(int maximumLength) : base(maximumLength)
    {
        ErrorMessageResourceType = typeof(CustomValidationResource);
    }

    public override string FormatErrorMessage(string name)
    {
        ErrorMessageResourceName = MinimumLength > 0 ? "StringLengthAttributeMinMax" : "StringLengthAttributeMax";
        return base.FormatErrorMessage(name);
    }
}

Где у меня есть локализованный ресурс "CustomValidationResource" с сообщениями проверки, и установите его как ErrorMessageResourceType. Затем, переопределяя функцию FormatErrorMessage, я решаю, какая строка сообщения должна применяться в зависимости от дополнительных параметров.

Итак, вопрос здесь: Кто-нибудь знает, где мы можем найти весь список ключей ресурсов, используемых атрибутами DataAnnotation, и посмотреть, сколько разных сообщений об ошибках мы имеем в каждом, не тестируя каждый?

Или даже лучше, можем ли мы иметь исходный файл RESX, чтобы увидеть строковые шаблоны и локализовать их, используя те же ключи ресурсов? Таким образом, изменение только ErrorMessageResourceType должно работать для всех атрибутов DataAnnotations, и мне не нужно угадывать, где положить "{1}" или "{2}" в мою локализованную строку.

Спасибо, Серги

4b9b3361

Ответ 1

Если вы все еще ищете обзор строк проверки, ниже вы можете найти ресурсы из System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources, как указано в Tz_:

[ArgumentIsNullOrWhitespace, The argument '{0}' cannot be null, empty or contain only white space.]
[AssociatedMetadataTypeTypeDescriptor_MetadataTypeContainsUnknownProperties, The associated metadata type for type '{0}' contains the following unknown properties or fields: {1}. Please make sure that the names of these members match the names of the properties on the main type.]
[AttributeStore_Type_Must_Be_Public, The type '{0}' must be public.]
[AttributeStore_Unknown_Method, The type '{0}' does not contain a public method named '{1}'.]
[AttributeStore_Unknown_Property, The type '{0}' does not contain a public property named '{1}'.]
[Common_NullOrEmpty, Value cannot be null or empty.]
[Common_PropertyNotFound, The property {0}.{1} could not be found.]
[CompareAttribute_MustMatch, '{0}' and '{1}' do not match.]
[CompareAttribute_UnknownProperty, Could not find a property named {0}.]
[CreditCardAttribute_Invalid, The {0} field is not a valid credit card number.]
[CustomValidationAttribute_Method_Must_Return_ValidationResult, The CustomValidationAttribute method '{0}' in type '{1}' must return System.ComponentModel.DataAnnotations.ValidationResult.  Use System.ComponentModel.DataAnnotations.ValidationResult.Success to represent success.]
[CustomValidationAttribute_Method_Not_Found, The CustomValidationAttribute method '{0}' does not exist in type '{1}' or is not public and static.]
[CustomValidationAttribute_Method_Required, The CustomValidationAttribute.Method was not specified.]
[CustomValidationAttribute_Method_Signature, The CustomValidationAttribute method '{0}' in type '{1}' must match the expected signature: public static ValidationResult {0}(object value, ValidationContext context).  The value can be strongly typed.  The ValidationContext parameter is optional.]
[CustomValidationAttribute_Type_Conversion_Failed, Could not convert the value of type '{0}' to '{1}' as expected by method {2}.{3}.]
[CustomValidationAttribute_Type_Must_Be_Public, The custom validation type '{0}' must be public.]
[CustomValidationAttribute_ValidationError, {0} is not valid.]
[CustomValidationAttribute_ValidatorType_Required, The CustomValidationAttribute.ValidatorType was not specified.]
[DataTypeAttribute_EmptyDataTypeString, The custom DataType string cannot be null or empty.]
[DisplayAttribute_PropertyNotSet, The {0} property has not been set.  Use the {1} method to get the value.]
[EmailAddressAttribute_Invalid, The {0} field is not a valid e-mail address.]
[EnumDataTypeAttribute_TypeCannotBeNull, The type provided for EnumDataTypeAttribute cannot be null.]
[EnumDataTypeAttribute_TypeNeedsToBeAnEnum, The type '{0}' needs to represent an enumeration type.]
[FileExtensionsAttribute_Invalid, The {0} field only accepts files with the following extensions: {1}]
[LocalizableString_LocalizationFailed, Cannot retrieve property '{0}' because localization failed.  Type '{1}' is not public or does not contain a public static string property with the name '{2}'.]
[MaxLengthAttribute_InvalidMaxLength, MaxLengthAttribute must have a Length value that is greater than zero. Use MaxLength() without parameters to indicate that the string or array can have the maximum allowable length.]
[MaxLengthAttribute_ValidationError, The field {0} must be a string or array type with a maximum length of '{1}'.]
[MetadataTypeAttribute_TypeCannotBeNull, MetadataClassType cannot be null.]
[MinLengthAttribute_InvalidMinLength, MinLengthAttribute must have a Length value that is zero or greater.]
[MinLengthAttribute_ValidationError, The field {0} must be a string or array type with a minimum length of '{1}'.]
[PhoneAttribute_Invalid, The {0} field is not a valid phone number.]
[RangeAttribute_ArbitraryTypeNotIComparable, The type {0} must implement {1}.]
[RangeAttribute_MinGreaterThanMax, The maximum value '{0}' must be greater than or equal to the minimum value '{1}'.]
[RangeAttribute_Must_Set_Min_And_Max, The minimum and maximum values must be set.]
[RangeAttribute_Must_Set_Operand_Type, The OperandType must be set when strings are used for minimum and maximum values.]
[RangeAttribute_ValidationError, The field {0} must be between {1} and {2}.]
[RegexAttribute_ValidationError, The field {0} must match the regular expression '{1}'.]
[RegularExpressionAttribute_Empty_Pattern, The pattern must be set to a valid regular expression.]
[RequiredAttribute_ValidationError, The {0} field is required.]
[StringLengthAttribute_InvalidMaxLength, The maximum length must be a nonnegative integer.]
[StringLengthAttribute_ValidationError, The field {0} must be a string with a maximum length of {1}.]
[StringLengthAttribute_ValidationErrorIncludingMinimum, The field {0} must be a string with a minimum length of {2} and a maximum length of {1}.]
[UIHintImplementation_ControlParameterKeyIsNotAString, The key parameter at position {0} with value '{1}' is not a string. Every key control parameter must be a string.]
[UIHintImplementation_ControlParameterKeyIsNull, The key parameter at position {0} is null. Every key control parameter must be a string.]
[UIHintImplementation_ControlParameterKeyOccursMoreThanOnce, The key parameter at position {0} with value '{1}' occurs more than once.]
[UIHintImplementation_NeedEvenNumberOfControlParameters, The number of control parameters must be even.]
[UrlAttribute_Invalid, The {0} field is not a valid fully-qualified http, https, or ftp URL.]
[ValidationAttribute_Cannot_Set_ErrorMessage_And_Resource, Either ErrorMessageString or ErrorMessageResourceName must be set, but not both.]
[ValidationAttribute_IsValid_NotImplemented, IsValid(object value) has not been implemented by this class.  The preferred entry point is GetValidationResult() and classes should override IsValid(object value, ValidationContext context).]
[ValidationAttribute_NeedBothResourceTypeAndResourceName, Both ErrorMessageResourceType and ErrorMessageResourceName need to be set on this attribute.]
[ValidationAttribute_ResourcePropertyNotStringType, The property '{0}' on resource type '{1}' is not a string type.]
[ValidationAttribute_ResourceTypeDoesNotHaveProperty, The resource type '{0}' does not have an accessible static property named '{1}'.]
[ValidationAttribute_ValidationError, The field {0} is invalid.]
[ValidationContext_Must_Be_Method, The ValidationContext for the type '{0}', member name '{1}' must provide the MethodInfo.]
[ValidationContextServiceContainer_ItemAlreadyExists, A service of type '{0}' already exists in the container.]
[Validator_InstanceMustMatchValidationContextInstance, The instance provided must match the ObjectInstance on the ValidationContext supplied.]
[Validator_Property_Value_Wrong_Type, The value for property '{0}' must be of type '{1}'.]

(MVC 4,.NET 4.0)

Ответ 2

Если вы открываете System.ComponentModel.DataAnnotations.dll с помощью инструмента, такого как Reflector, вы можете открыть ресурс System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resources и посмотреть.

Вы также можете проверить класс System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources, который обеспечивает доступ к строкам ресурса.