數據註釋不僅用於驗證,還用於使您的代碼與數據庫同步。即在EF Code First中,如果刪除了Required字段,那麼您的數據庫必須允許將NULL插入到匹配列中。
因此,你可以做以下的方法:
- 創建你的實體模型類,以便爲最低要求儘可能
- 創建將實現IValidatableObject接口
- 實現IValidatableObject您的視圖/ DTO模型類接口並在那裏進行條件驗證
IValidatableObject接口允許您的類由Validator使用(MSDN on Validator)來自System.ComponentModel.DataAnnotations命名空間,與通過註釋屬性完成驗證的方式相同。
接口實現應該是這樣的:
public class FormDto: IValidatableObject
{
public int ID { get; set; }
[Required("Title is required.")]
public string Title { get; set; }
[Required("Body is required.")]
public string Body { get; set; }
public bool IsDraft { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(!IsDraft && string.IsNullOrWhiteSpace(Body)) yield return new ValidationResult("Body is required.", new string [] {"Body"});
if(!IsDraft && string.IsNullOrWhiteSpace(Title)) yield return new ValidationResult("Title is required.", new string [] {"Title"});
}
}
如果您的視圖/ DTO模式正在經歷即MVC管道,這個接口將被自動調用。如果由於任何原因您發現它沒有被調用(我不知道您的解決方案的結構),您可以將此代碼插入到您的流程管道中的某個位置,並且它將調用驗證/拋出異常:
public static class IValidatableObjectExtensions
{
public static void SelfValidate(this IValidatableObject model)
{
ValidationContext ctx = new ValidationContext(model);
Validator.ValidateObject(model, ctx, true);
}
}