2012-03-12 54 views
0

我有一個模型實現了IValidatlableObject,並通過Validate方法進行自定義錯誤檢查。僅在某些操作中使用IValidatableObject

當我創建一個對象時一切正常,但是當我嘗試編輯該對象時,我不想執行該自定義驗證。

我怎麼知道從什麼行動我調用驗證方法,以便不做驗證?

更新: 這是心肌梗死模型:

public class Ingredient : IValidatableObject 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Required!!")] 
    public string Name { get; set; } 

    public virtual List<Product> Products { get; set; } 

    public Ingredient() 
    { 
     Products = new List<Product>(); 
    } 

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     using (var uow = new UnitOfWork()) 
     { 
      var ingredient = uow.IngredientRepository.Get(i => i.Name ==Name).FirstOrDefault(); 

      if (ingredient != null) 
       yield return new ValidationResult("Duplicate!!!.", new[] { "Name" }); 
     } 


    } 
} 

}

所以當我創建的成分我想驗證ALL(屬性+ IValidatable) 但是當我編輯Ingrendient我只想驗證屬性(所以我的意思是跳過IValidatable) 任何方法來知道,在IValidatable方法,我從哪裏調用驗證?

謝謝!模型的

回答

2

檢查主鍵 - 不管是不是空:)

+0

我沒有想到它,但是,是的,這可能是一個不錯的解決方案!!!所以我認爲沒有辦法知道行動/控制器裏面的驗證方法 – Tekno 2012-03-12 20:21:46

0

如果你不想驗證對象,不叫Model.IsValid(或Validate(),如果你明確做就可以了。如果不知道更多關於你的問題的詳細信息,那麼回答的不僅僅是這些,

1

這裏更多的「MVCish」正確的方法是你實際上有兩個類,一個用於編輯的Create方法,一個用於編輯類的任何共享驗證,任何然後不共享不會被檢查在這裏。

+0

但它會有點難看!兩個相同的類只用於驗證。沒有太多的乾燥和不可控的。我認爲這是您必須在純MVC或lessMVC之間進行選擇的時候,但更易於維護 - – Tekno 2012-03-12 20:41:08

+0

這並不違反DRY。 DRY適用於邏輯複製,而不是查看模型。這是MVC標準。如果你在viewmodel中關注它,那麼它們都從共享道具的單一來源繼承,你在這裏保存的是什麼 - 創建和編輯方法有兩個獨立的目的,你會發現應用程序得到更復雜的視圖模型可以幫助。 – 2012-03-13 23:00:06

相關問題