DataAnnotations и Resx в библиотеке классов - PullRequest
2 голосов
/ 31 января 2011

Для моего приложения (ASP.NET MVC 3.0 RTM, Razor View Engine) я хотел бы использовать DataAnnotations для своих моделей. Если я сохраню классы модели в веб-проекте, у меня могут быть ресурсы resx в App_GlobalResources или App_LocalResources без встраивания .resx в .resources файлы.

Игнорирование недавно появившихся доменов приложений и другие соображения, это идеальный вариант, потому что изменение чего-то незначительного в локализованном ресурсе, например опечатка или неправильный перевод, не требует компиляции.

Однако после перемещения моих моделей в библиотеку классов я не вижу способа сохранить файлы .resx в качестве выходных данных и по-прежнему использовать атрибуты DataAnnotations. Я что-то упустил?

Проблема заключается в том, как атрибуты находят ресурсы. Например, свойство «Имя» может выглядеть так:

    [Display(Name = "MyEntity_Name", ResourceType = typeof(Validations))]
    [Required(ErrorMessageResourceName="MyEntity_Name_Required", 
       ErrorMessageResourceType = typeof(Validations))]
    [StringLength(150, MinimumLength = 2)]
    public string Name { get; set; }

Это требование для строго типизированной оболочки ресурсов стало проклятием моего существования за последние 24 часа.

Я попытался обобщить обертку, но похоже, что атрибуты проверки специально ищут свойство обертки, называемое MyEntity_Name для DisplayAttribute и MyEntity_Name_Required для RequiredAttribute. Я не углубился в код DataAnnotations, чтобы увидеть, есть ли какая-то магия, которую я могу осуществить. Я надеялся, что кто-то еще столкнулся с этим и имел какие-либо идеи.

Вопрос
Можно ли использовать DataAnnotations ValidationAttributes (включая DisplayAttribute) в библиотеке классов без встраивания файлов resx в .resources файлы?

Gotchas: (
В будущем я бы хотел перейти от ресурсов resx к базам данных с минимальными затратами на программирование. Я не могу сделать это сейчас из-за ограниченных ресурсов (без каламбура). Итак, я хочу избежать обхода ResourceProvider. Кроме того, я хочу избежать перезаписи или переноса всех атрибутов в пространстве имен System.ComponentModel.DataAnnotations.

1 Ответ

3 голосов
/ 31 января 2011

Я что-то упустил?

Да, вам не хватает моделей просмотра.Действия контроллера принимают / передают модели представления из / в представления, а не модели.Модели представлений - это классы, которые специально адаптированы к потребностям данного представления.Они содержат только необходимые свойства и правильное форматирование для данного представления.Модель представления может быть подмножеством модели или совокупностью нескольких моделей (это зависит от требований представления).Модели представлений всегда определяются в веб-проекте, поскольку они очень тесно связаны с представлениями.Таким образом, именно модели представлений следует локализовать / глобализировать с помощью ресурсов.

Пример рабочего процесса:

  1. Вызывается действие контроллера, и он запрашивает хранилище для получения модели
  2. Контроллер отображает модель на соответствующую модель вида ( AutoMapper Вы можете здесь)
  3. Контроллер передает модель вида на вид, и вид отображает ее с правильным форматированием /локализация.

Вывод: модели не следует форматировать / локализовать, иначе их будет сложнее использовать повторно.

...