模型和viewmodel mvc中的验证

时间:2016-02-12 13:13:57

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

我有一个域模型,里面有10个字段。 我有5个视图与该模型的不同字段(每个视图具有不同的字段集)。为此,我为每个视图创建了一个ViewModel(总共5个ViewModels)。

我的问题是在每个视图模型中我必须复制验证逻辑。是否有任何简单的方法可以避免每个ViewModel的验证逻辑重复?

以下是我的模型和ViewModel的外观。

public class Student {
    public int Id { get; set; }
    [Required]
    [StringLength(50)]
    public string Name { get; set; }
    [StringLength(15)]
    [DataType(DataType.PhoneNumber)]
    public string Mobile { get; set; }
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
    [Range(5,12)]
    public int ClassId { get; set; }
    [Range(0,1000)]
    public int MarksObtained { get; set; }
    [DataType(DataType.DateTime)]
    public DateTime DateOfBirth { get; set; }
}


public class StudentDetailsViewModel {
    //validation duplicated for each field
    public int Id { get; set; }
    [Required]
    [StringLength(50)]
    public string Name { get; set; }
    [StringLength(15)]
    [DataType(DataType.PhoneNumber)]
    public string Mobile { get; set; }
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
    [DataType(DataType.DateTime)]
    public DateTime DateOfBirth { get; set; }
}


public class StudentMarksViewModel
{
    //validation duplicated for each field
    public int Id { get; set; }
    [Required]
    [StringLength(50)]
    public string Name { get; set; }
    [Range(5, 12)]
    public int ClassId { get; set; }
    [Range(0, 1000)]
    public int MarksObtained { get; set; }
}

所以我不希望我的验证逻辑到处重复。我想要一个集中的验证逻辑和我的ViewModel来使用它们,而不是随处可见。

1 个答案:

答案 0 :(得分:1)

让每个ViewModel继承BaseModel并在那里拥有验证逻辑。

您的基本型号

public class VM_Student //Your Base
{
  //Only include Attributes here that you need every time.
  public int Id { get; set; }
  [Required]
  [StringLength(50)]
  public string Name { get; set; }

}

您的ViewModels

public class VM_StudentFull : VM_Student
{
  //Only Add the Extra Fields here, the StudentFull inherits
  //the other attributes and validation
  [StringLength(15)]
  [DataType(DataType.PhoneNumber)]
  public string Mobile { get; set; }
  [DataType(DataType.EmailAddress)]
  public string Email { get; set; }
  [DataType(DataType.DateTime)]
  public DateTime DateOfBirth { get; set; }          
}

public class VM_StudentMarks : VM_Student
{
  //Only Add the Extra Fields here again,
  //the StudentMarks inherits the other attributes and validation
  [Range(5,12)]
  public int ClassId { get; set; }
  [Range(0,1000)]
  public int MarksObtained { get; set; }
  [DataType(DataType.DateTime)]           
}

这只是一个简单的示例,当然您需要相应地将其与您的解决方案相匹配。 在每个ViewModel中整理所需的属性,并将其明确添加到新的ViewModel