5

Statik kod yerine bir veri deposundan doğrulama özniteliklerinin ayarlanmasına izin vermek için özel bir sağlayıcı kurdum. .NET MVC 4 projemde istemci tarafında doğrulama ile harika çalışıyor, ancak sunucu tarafı doğrulaması çalışmasını alamıyorum.Özel DataAnnotationsModelValidatorProvider ile sunucu tarafı doğrulaması

CustomModelValidatorProvider .cs: Benim Global.asax.cs olarak

 

    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider 
    { 
     protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes) 
     { 
      // set attributes from datastore here 

      return base.GetValidators(metadata, context, attributes); 
     } 
    } 

Ben:

 

    protected void Application_Start() 
    { 
     ModelValidatorProviders.Providers.Clear(); 
     ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); 
    } 

oysa benim bir Web API yönteminde

: Burada

 

    var validationResultList = new List(); 
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true); 

, geçerli her zaman doğrudur. Jquery istemci tarafı doğrulama bir hata görüntülediğinde bile. Sunucu tarafında, özel sağlayıcım veri ek açıklamalarını uygulamak için kullanılmıyor. GetValidators() uygulamasında bir kesme noktası ayarladığımda, Görünüm oluşturulduğunda ve istemci tarafı doğrulayıcılarını doğru şekilde görüntülediğinde çağrılır, ancak model denetleyiciye bağlı olduğunda yeniden çağrılmaz.

Bir adımı kaçırdım mı? Herhangi bir yardım büyük beğeni topluyor!

GÜNCELLEME

özel doğrulayıcı nesne Kontrolör gönderilen zaman düzgün çalışır, ancak bir ApiController gönderilen zaman ateş almaz.

+0

Üzgünüz, bu sorunun sizin olduğunu anlayamadığınız diğer bir soruya yorum yazdım! Bildiğim kadarıyla, API denetleyicileri ve standart denetleyiciler ayrı model bağlayıcıları kullanırlar, böylece sorun doğrulayıcıyı doğru model bağlayıcıya doğru bir şekilde eklemez. Şu anda PC'mde değil ama daha sonra ona bir göz atacağım :) – Henry

+0

@HenryGarle Evet, bunu test ettim ve bir denetleyiciye gönderildiğinde özel doğrulama işlemi çalışıyor, ama ApiController değil. ApiController için doğru şekilde nasıl kaydedileceğinden emin değilsiniz. – Dave

+0

Tamam, bu iyi bir başlangıç, ModelValidatorProvider'dan miras alır mı? – Henry

cevap

3

Sonunda bunu anladım, oldukça basit bir cevap. ApiControllers yalnızca System.Web.Http.Validation ad alanındaki sağlayıcılara yanıt verir, düzenli denetleyiciler ve istemci tarafı doğrulaması için kullanılan System.Web.Mvc ad alanı değil.

Hem istemci tarafı doğrulaması hem de ApiControllers'de sunucu doğrulaması için ikisini de uyguladım.

İlgili konular