Почему я не могу использовать ресурсы как ErrorMessage с DataAnnotations? - PullRequest
16 голосов
/ 22 апреля 2010

Почему я не могу так поступить?

[Required(ErrorMessage = "*")]
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessage = Resources.RegistrationModel.UsernameError)]
public string Username { get; set; }

О чем говорит сообщение об ошибке?

Аргументом атрибута должно быть константное выражение, выражение typeof иливыражение создания массива типа параметра атрибута.

Ответы [ 5 ]

42 голосов
/ 22 апреля 2010

Когда вы используете свойство ErrorMessage, ему могут быть назначены только постоянные строки или строковый литерал.

Используйте ErrorMessageResourceType и ErrorMessageResourceName вместо того, чтобы специализировать свои ресурсы.

[RegularExpression(
    "^[a-zA-Z0-9_]*$", 
    ErrorMessageResourceType=typeof(Resources.RegistrationModel),
    ErrorMessageResourceName= "UsernameError"
)]

Обратите внимание, что ресурсы должны быть public (может быть установлено в редакторе ресурсов).

Настройка доступа к общедоступным ресурсам http://img402.imageshack.us/img402/504/98454371.jpg

3 голосов
/ 21 сентября 2011

Пожалуйста, смотрите эту ссылку: http://code.msdn.microsoft.com/Getting-Started-WCF-RIA-1469cbe2/sourcecode?fileId=19242&pathId=774666288 (ссылка не работает, но оставлена ​​для целей атрибуции)

public sealed partial class RegistrationData 
{ 
    [Key] 
    [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))] 
    [Display(Order = 0, Name = "UserNameLabel", ResourceType = typeof(RegistrationDataResources))] 
    [RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))] 
    [StringLength(255, MinimumLength = 4, ErrorMessageResourceName = "ValidationErrorBadUserNameLength", ErrorMessageResourceType = typeof(ErrorResources))] 
    public string UserName { get; set; } 
1 голос
/ 22 апреля 2010

Попробуйте FluentModelMetaDataProvider .

Удалось использовать ресурсы для сообщений об ошибках строго типизированным способом.

выглядит так:

using System.Web.Mvc.Extensibility;

namespace UI.Model
{
    public class StoreInputMetadata : ModelMetadataConfigurationBase<StoreInput>
    {
        public StoreInputMetadata()
        {
            Configure(m => m.Id)
                .Hide();
            Configure(model => model.Name)
                .Required(Resources.Whatever.StoreIsRequired)
                .MaximumLength(64, Resources.Whatever.StoreNameLengthSomething);
        }
    }
}

Что означает сообщение об ошибке?

Аргументом атрибута должно быть постоянное выражение, выражение typeof или выражение создания массива типа параметра атрибута.

Это уже говорит само за себя. C # не является динамическим языком, как Ruby, где вы можете писать классы, которые наследуют случайный базовый класс во время выполнения. :)

Вот что Скит говорит об этом.

0 голосов
/ 22 апреля 2010

Вместо этого вы должны взглянуть на свойства ErrorMessageResourceName и ErrorMessageResourceType этого атрибута. Они позволяют извлекать сообщение об ошибке из ресурса.

0 голосов
/ 22 апреля 2010

Это означает, что вы не можете определить значение аргумента, передаваемого в атрибут, в runtime, оно должно быть в compile time, поэтому значение встроено в сборку.

Значение сообщения об ошибке должно быть константным выражением.

Для информации аргументы атрибутов могут быть только типов bool, byte, char, short, int, long, float, double, string, System.Type и enums.

...