DataAnnotations и Resources не работят добре

Използвам анотации към данни в приложение MVC2 и съм малко обезкуражен, когато се опитвам да използвам RESX файлови ресурси за съобщения за грешки.

Опитах следното, но продължавам да получавам изключение „Аргументът на атрибут трябва да бъде постоянен израз, израз тип of или израз за създаване на масив от тип параметър на атрибут“

[Required(ErrorMessage = Resources.ErrorMessages.Required)]
[Required(ErrorMessageResourceName = Resources.ErrorMessages.Required,
          ErrorMessageResourceType = typeof(Resources.ErrorMessages)]

Продължавам да получавам това съобщение за грешка, освен ако не заменя ErrorMessageResourceName с „Задължително“ вместо Resources.ErrorMessages.Required.

Може ли някой да ми каже дали правя това правилно?


person devlife    schedule 15.03.2010    source източник


Отговори (1)


Да, това, което правите в крайна сметка, е правилно. ErrorMessageResourceName приема това, което подсказва името, името на ресурс, а не самия ресурс.

Resources.ErrorMessages.Required сочи към действителното (локализирано) съобщение за грешка (ресурс). Името на ресурса е просто „Задължително“, а типът на мениджъра на ресурси (използван за ErrorMessageResourceType) е класът, който съдържа този ресурс, в този случай Resources.ErrorMessages клас.

Така че вашата декларация трябва да изглежда така:

[Required(ErrorMessageResourceType = typeof(Resources.ErrorMessages),
    ErrorMessageResourceName = "Required")]
public string Something { get; set; }
person Aaronaught    schedule 15.03.2010
comment
@devlife: Не. Не, ако искате локализация. Точно за това са свойствата на ресурса. Всъщност, така е с всяка локализация, в някакъв момент от веригата ще трябва да потърсите ресурсен низ въз основа на името, точно така работят външните ресурси. И това все още е строго типизирано въз основа на класа на ресурса, просто нямате безопасност по време на компилиране на самото име на ресурса. Ако искате това, просто създайте клас като ResourceNames с редове като public const string Required = "Required", след което можете да ги посочите като имена на ресурси. - person Aaronaught; 16.03.2010