2014-01-14 69 views
0

我遇到了這個問題,我應該在保存模型時允許不同的驗證集合。通常,驗證取決於用戶想要如何保存數據。例如,如果用戶想要將他的數據保存爲「草稿」,我應該允許一些字段爲空。如果不是「草案」,我應該加大限制。實體框架中的多組驗證

class Form 
{ 
    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; } 
} 

在上面的代碼中,我只希望驗證身體只有在IsDraft爲false時才起作用。

如何創建多組驗證?或者如何在Entity Framework中正確創建條件驗證?

回答

1

數據註釋不僅用於驗證,還用於使您的代碼與數據庫同步。即在EF Code First中,如果刪除了Required字段,那麼您的數據庫必須允許將NULL插入到匹配列中。

因此,你可以做以下的方法:

  1. 創建你的實體模型類,以便爲最低要求儘可能
  2. 創建將實現IValidatableObject接口
  3. 實現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); 
    } 
}