2012-03-12 2 views
0

私はIValidatlableObjectを実装するモデルを持っており、Validateメソッドによるカスタムエラーチェックがあります。一部のアクションでのみIValidatableObject

オブジェクトを作成すると問題はありませんが、そのオブジェクトを編集しようとすると、そのカスタム検証は実行されません。

バリデーションを行わないために、私がValidateメソッドを呼び出している動作からどのように知ることができますか?

更新:私は成分を作成するときに、私はすべてを(+ IValidatable属性) を検証したいが、私はIngrendientを編集するとき、私は唯一の希望

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" }); 
     } 


    } 
} 

}

: これはMIモデルであり、属性を検証する(つまり、IValidatableをスキップすることを意味する) IValidatableメソッド内で、Validateを呼び出すメソッドを知る方法はありますか?

ありがとうございました!

答えて

2

は、モデルの主キーを確認してください - それがnullでないかどうか:)

+0

私はそれではないと思います素晴らしい解決策!!!だから、アクション/コントローラをValidateメソッド内に知る方法はないと思う。 – Tekno

0

オブジェクトを検証したくない場合は、明示的にそれをやっている場合は、Model.IsValid(またはValidate()を呼び出すことはありませんすることができます。

1

"MVCish"という正しい方法は、実際には2つのクラス、1つはCreateメソッド用、もう1つは編集のためのものです。どんな共有妥当性検査のためのクラスでも、共有されていないものはここでチェックされません。

+0

しかし、これはちょっと醜いだろう! 2つの同一のクラスは検証のためにのみ使用されますあまり乾燥していないし、manteinableではない。私はこれがあなたが純粋なMVCかより少ないMVCのどちらかを選択しなければならない時だと思いますが、保守のために簡単です – Tekno

+0

これはDRYに違反しません。 DRYはビューのモデルではなくロジックの複製に適用されます。これはMVC標準です。あなたがviewmodelでそれを心配しているなら、両方とも共有された小道具のための単一のソースから継承します。ここで本当に保存しているものを2つの別々の目的に役立ちます。モデルが助けることができます。 –

関連する問題