我有一个域模型,里面有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来使用它们,而不是随处可见。
答案 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
。