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

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

Почему я не могу это сделать?

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

Каково сообщение об ошибке, сообщающее мне?

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

4b9b3361

Ответ 1

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

ErrorMessageResourceName этого используйте ErrorMessageResourceType и ErrorMessageResourceName чтобы конкретизировать ваши ресурсы.

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

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

Setting resource access to public

Ответ 2

Пожалуйста, просмотрите эту ссылку: 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; } 

Ответ 3

Попробуйте 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 или выражением создания массива типа параметра атрибута.

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

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

Ответ 4

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

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

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

Ответ 5

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