2016-04-05 23 views
0

Tabanlı Farklı Doğrulama Mantığı Kullanma Bir istemci uygulamasının birden çok marka arasında yeniden kullanılacak bir web uygulaması oluşturma isteğimiz vardır. Veri yapısı aynı kalacaktır, ancak belirli kullanım durumları, başkaları için olmayabilecekleri bazı alanların gerekli olduğunu belirtebilir.Girdi (ASP.NET MVC)

Örneğin, biz temel KKB yakalamak için bir form var diyelim, ve görünümü modeli aşağıdaki gibidir:

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

dayanarak örneğin bir rota veri parametresi doğrulama kuralları farklı olabilir. Bu yüzden kuralları gerçekten doğrulama öznitelikleri olarak kodlamak istemiyorum. Ben

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... 
    } 
} 

bu koşullu doğrulama için daha temiz bir yaklaşım var mı? ... bir sözlükte doğru doğrulayıcı ayrı doğrulayıcı arayüzü kullanarak ve yukarı bakarak düşündü?

Düzenleme: Üçüncü taraf kitaplığı tavsiyeleri millet aramıyorum. Doğrulamanın olabildiğince esnek olması için yapılan yapılandırmayı tavsiye ediyorum.

+0

kullanarak Bakılacaklar [şaşmaz] (http://foolproof.codeplex.com/) ya da ikinizi de istemci ve sunucu tarafı doğrulama vermek benzer koşullu nitelikler (veya kendi yazabilirsiniz) yani –

+0

Belirli bir senaryo için doğrulama gereksinimleri değişirse, modele dokunmak istemediğimden, özellik tabanlı doğrulamayı kullanmak istemediğimi özellikle söylüyorum. – Chris

cevap

1

Görünümünüzün modelindeadresinden System.ComponentModel.DataAnnotations ad boşluğundan devralabilirsiniz, ardından belirli koşullara göre doğrulamayı denetlemek için Doğrulama yöntemini kullanın.

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