2016-04-05 10 views
0

複数のブランドにまたがって再利用されるWebアプリケーションを構築するというクライアントのリクエストがあります。データ構造は同じままですが、特定のユースケースでは、あるフィールドが他のフィールドでない可能性がある場所で必要とされることがあります。入力(ASP.NET MVC)に基づいた異なる検証ロジックの使用

例えば、我々は、基本的なPIIをキャプチャするフォームを持っているとしましょう、とビューモデルは次のようになります。例えば、ルートデータパラメータに基づいて

public class UserViewModel 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string Email {get;set;} 
    public string Gender {get;set;} 
} 

、検証ルールが異なる場合があります。だから私は本当に検証属性としてルールをハードコードしたくありません。私は

public ActionResult DoSomething(UserViewModel model) 
{ 
    var offer = RouteData.Values["offer"];   
    var validator = validators.ContainsKey(offer) 
     ? validators[offer] : dict["default"]; 

    validator.Validate(model, ModelState); 

    if (ModelState.IsValid) 
    { 
     // etc... 
    } 
} 

この条件の検証にクリーンなアプローチがあります...辞書に正しいバリデータを別のバリデータ・インタフェースを使用して検索すると思いましたか?

編集:私はサードパーティのライブラリ推奨の人々を探していません。私は検証を可能な限り柔軟に構成するためのアドバイスを探しています。

+0

ルックすなわち –

+0

具体的には、属性ベースの検証を使用したくないと述べました。特定のシナリオで検証要件が変更された場合、モデルに触れたくないからです。 – Chris

答えて

1

ビューモーダルではのSystem.ComponentModel.DataAnnotations名前空間を継承し、Validateメソッドを使用して特定の条件に基づいて検証をチェックできます。

あなたの両方のクライアント側とサーバー側の検証を与えるために、[誰にでもできる](http://foolproof.codeplex.com/)または同様の条件属性を使用して(またはあなた自身を書くことができます)で

public class UserViewModel : IValidatableObject 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string Email {get;set;} 
    public string Gender {get;set;} 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     if(string.IsNullOrWhiteSpace(FirstName)) 
      yield return new ValidationResult("Firstname required", new[] {"FirstName"}) 
    } 
} 
関連する問題