Пользовательская условная проверка для строго типизированного представления в MVC - PullRequest
0 голосов
/ 13 октября 2011

У меня есть модель Person и модель студента. Модель студента имеет 2 FK PersonIDs; один для ученика, другой для родителя.

Мой взгляд выглядит так:

  @Html.EditorFor(m => m.student.Person.FirstName)
  @Html.EditorFor(m => m.student.Person.DOB)

  @Html.EditorFor(m => m.student.Father.FirstName)

Модели будут выглядеть так:

  public partial class Person
  {
    public int PersonID { get; set; }

    [Required]
    [PlaceHolder("First Name")]
    public string FirstName { get; set; }

    [PlaceHolder("Birth Date")]
    public Nullable<System.DateTime> DOB { get; set; }
  }


 public partial class Student
 {
    public int Student_PersonID { get; set; }
    public int Parent_PersonID { get; set; }
 }

Я хочу, чтобы поле DOB было обязательным для ученика, но не для родителя. Если я добавлю атрибут [Required] к элементу DOB, он потребуется для обоих. Есть ли способ, которым я могу установить требуемое поле в представлении? или есть способ в модели или с помощью атрибута проверки, чтобы сделать это?

fyi ... я использую базу данных EF первый подход

спасибо

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

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

В этом случае, если ваше представление должно отображать следующие поля:

  • StudentFirstName
  • StudentDOB
  • ParentFirstName
  • ParentDOB

Тогда я бы предложил следующий вид:

public class PersonViewModel
{
   public int StudentPersonID { get; set; }

   [Required]
   public string StudentFirstName { get; set; }

   [Required]
   public DateTime StudentDOB { get; set; }

   public int ParentPersonID { get; set; }

   [Required]
   public string ParentFirstName { get; set; }

   public DateTime ParentDOB { get; set; }
}

Или, если вместо этого у вас есть 2 отдельных представления, отображаются:

  • StudentFirstName
  • StudentDOB

И отображение:

  • ParentFirstName
  • ParentDOB

Тогда я бы предложил иметь 2 отдельные модели вида:

public class StudentViewModel
{
   public int StudentPersonID { get; set; }

   [Required]
   public string StudentFirstName { get; set; }

   [Required]
   public DateTime StudentDOB { get; set; }
}

public class ParentViewModel
{
   public int ParentPersonID { get; set; }

   [Required]
   public string ParentFirstName { get; set; }

   public DateTime ParentDOB { get; set; }
}

Использование моделей вида таким образом позволит вам использовать [Обязательно] аннотации данных для полей, которые требуют их, а не пытаются создать обходной путь.Обратите внимание, что модели представлений не следует путать с моделями доменов, и поэтому эти данные необходимо будет сопоставить с моделью доменов.

Надеюсь, это поможет.

Если ваше приложениепростое приложение, вам может не потребоваться создание отдельного слоя бизнес-логики, и большинство книг представляют MVC только с простыми моделями, которые могут подойти.Однако, если вы будете искать вокруг, вы найдете другие примеры, где разработчики рекомендуют иметь модель представления отдельно от бизнес-модели, такую ​​как this

Я также рекомендовал бы прочитать Wrox Professional Enterprise.Чистый 2009 , где главы 7 и 8 дают отличные примеры бизнес-уровня с обсуждением шаблона сценария транзакции, шаблона активной записи и модели доменной модели.

0 голосов
/ 13 октября 2011

Один из способов - создать класс PersonRequired, который наследуется от Person. Добавьте класс метаданных в PersonRequired, чтобы у вас был PersonRequiredMetaData и в этом конкретном случае, что унаследованное поле DOB является обязательным. Вам нужно будет вручную скопировать значения между классами Person и PersonRequired или использовать AutoMapper. Я надеюсь, что есть лучший ответ, чем этот!

Другим вариантом является использование FluentValidation , которое позволит вам выполнять проверку отдельно от модели (не использует аннотации данных). Интересно, используют ли некоторые люди аннотации данных для требований к базе данных и свободно проверяют программные требования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...