我正在为项目使用MVC 5和Entity Framework。
我的项目中有一个模型:
public class ContractViewModel : IValidatableObject
{
public int Id { get; set; }
[Required]
[DisplayName("Registration Number")]
public string RegistrationNumber { get; set; }
[DisplayName("Start Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? StartDate { get; set; }
[DisplayName("Scheduled End Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? EndDate { get; set; }
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
// check 1: Start Date should be before End Date
if (StartDate != null && EndDate != null)
{
if (DateTime.Compare(StartDate.Value, EndDate.Value) > 0)
{
yield return new ValidationResult("Start Date must be before End Date");
}
}
}
}
我需要在那里进行一些检查,注册号需要填写,而不是已经存在。与开始日期一起必须在结束日期之前。
目前注册编号我在那里有必需的注释,因为它还没有存在,当我进行保存时,我在那里检查它是否已经存在我使用:
ModelState.AddModelError("", "Registration Number already exists.");
对于StartDate和EndData,我使用了IValidateObject接口中的Validate方法。
我没有在Validate方法中执行注册号检查的原因是我不希望该库(ProjectModels.dll)引用实体框架。
目前,当检查完成时,它们不会合并,因此如果未输入注册号且EndDate在StartDate之前,则仅显示注册号验证。
无论如何都要让他们一起表演?
注册号的必需注释也会在表单上的字段下显示错误消息,使用ValidationMessageFor属性,无论如何在出现这些错误时为其他2显示错误消息?
答案 0 :(得分:0)
编写需要自定义代码的复杂业务规则,通过调用存储库数据访问代码来查找数据可能既有趣又具有挑战性。
有一个名为Foolproof的Nuget包,它增加了一些扩展你可以做的事情的属性,但是创建业务对象的优秀框架是CSLA.Net。