MVC中强类型视图的自定义条件验证

时间:2011-10-13 14:47:26

标签: asp.net-mvc entity-framework razor

我有一个Person模型和一个学生模型。学生模型有2个FKs的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 个答案:

答案 0 :(得分:2)

我建议让视图模型与视图中显示的字段匹配。如果稍后要从视图中删除字段,那么它也将从域模型中删除。

在这种情况下,如果您的视图要显示以下字段:

  • 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

AND显示:

  • ParentFirstName
  • ParentDOB

然后我会建议有两个独立的视图模型:

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 .Net 2009第7章和第7章。图8给出了业务层的很好的例子,讨论了事务脚本模式,活动记录模式和域模型模式。

答案 1 :(得分:0)

一种方法是创建一个继承自Person的PersonRequired类。向PersonRequired添加元数据类,因此您具有PersonRequiredMetaData,并且具体而言,需要继承的DOB字段。您需要手动复制Person和PersonRequired类之间的值或使用AutoMapper。我希望有一个比这更好的答案!

另一种选择是使用FluentValidation,它允许您与模型分开进行验证(不使用数据注释)。我想知道是否有人正在使用数据注释来满足数据库要求和流程验证程序要求。