Как сохранить DataAnnotations до ViewModels - PullRequest
2 голосов
/ 05 мая 2011

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

В основном я ленивый, и я стараюсь сделать его максимально сухим.

class User
{
    [Required]
    public string FirstName {get; set; }
    [Required]
    public string LastName {get; set; }
    public datetime RegistrationDate {get; }
}

class CreateUserViewModel
{
    public string FirstName {get; set; }
    public string LastName {get; set; }    
}

Первый класс никогда не используется представлением, однако он содержит все аннотации данных, требуемые приложением. Второй класс всегда используется представлением CreateUser, но я не хочу повторно применять DataAnnotations. Это возможно? Если да, то как?

Ответы [ 4 ]

5 голосов
/ 05 мая 2011

См. Атрибут MetadataType , который позволит вам перенести аннотации данных в отдельный класс.

3 голосов
/ 05 мая 2011

Может быть, ленивость в этом случае не самая лучшая

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

Pro

  • это правда, что вам не придется повторять атрибуты проверки (особенно если они настраивают локализованные сообщения об ошибках = даже больше кода))

Con :

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

Подумайте о сложностиобъекты вашей модели и особенно процент тех из них, которые имеют подмножество свойств некоторой другой сущности (в терминах типов и имен).

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

1 голос
/ 05 мая 2011

Попробуйте:

interface IAmALazyUser
{
    [Required]
    string FirstName {get; set; }
    [Required]
    string LastName {get; set; }
}

class User : IAmALazyUser
{
    public string FirstName {get; set; }
    public string LastName {get; set; }
    public datetime RegistrationDate {get; }
}

class CreateUserViewModel : IAmALazyUser
{
    public string FirstName {get; set; }
    public string LastName {get; set; }    
}

Я бы не рекомендовал это, так как вы добавляете соединение только для того, чтобы не добавлять проверку в модель представления.

0 голосов
/ 05 мая 2011

Я не верю, что есть простое решение для этого.Вы должны будете немного повторить себя и аннотировать свои модели представления также.Если вы используете новейшую платформу сущностей вашего уровня данных, то вы можете воспользоваться проверкой данных с использованием аннотированных классов сущностей.поэтому, даже если вы забудете аннотировать модель представления, при сохранении контекста данных возникнет исключительная ситуация проверки.

...