2011-01-20 14 views
5

Bu tür bir ASP.NET MVC3:ASP.NET MVC 3'te RequiredAttribute ile mi çalışırken istemci tarafı doğrulama çalışmaz?

public sealed class RequiredFromResourceAttribute : RequiredAttribute 
{ 
    public RequiredFromResourceAttribute(string errorResourceName, string errorResourceTypeName) 
    { 
     this.ErrorMessageResourceName = errorResourceName; 
     this.ErrorMessageResourceType = Type.GetType(errorResourceTypeName); 
    } 
} 

öznitelik bir öznitelik yarattım:

[RequiredFromResource("Title", "Resources.Resource, MyProject.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")] 
public string Title { get; set; } 

Bu işe yaramadı ve MVC onu yoksaydı. Daha sonra RequiredAttribute'den bu şekilde miras alınan daha basit bir sınıf oluşturuyorum:

public class MyRequiredAttribute : RequiredAttribute 
{ 
} 

Bunu söylediğim gibi kullanıyorum. Ama yine işe yaramadı.

Tüm bu yollar "DisplayNameAtrribute" üzerinde mükemmel çalışır.

Sorun nedir?

+0

, marcind cevabı SkipHarris daha bu iyi yönetir: İşte alanı için ekran adını içeren güncellenmiş bir versiyonu. Skip en içinde RequiredAttributeAdapter düzenli Gerekli kullanmak için istemci tarafı doğrulama yerine RequiredFromResourceAttribute ait öznitelik neden gibi görünüyor. – Keerigan

cevap

3

Sen Global.asax aşağıdaki kodu ekleyerek bu sorunu giderebilirsiniz:

Eğer IClientValidatable uygulamak için özel özellik gerekecektir Bu sorunu gidermek için

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredLocalizableAttribute), typeof(RequiredAttributeAdapter)); 
(cevabı here bulundu)

Alternatif marcind en çözümünü kullanarak, ben ModelClientValidationRequiredRule için yapıcı bir hata mesajı gerektirdiğini gördük. Bence

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     string msg = FormatErrorMessage(metadata.GetDisplayName()); 
     yield return new ModelClientValidationRequiredRule(msg); 
    } 
+0

@ marcind'in cevabı bu kadar iyi görünüyor. RequiredAttributeAdapter kullanmak, özel olan yerine normal Gerekli özniteliği çağırıyor gibi görünüyor. – Keerigan

+0

Skip'in cevabı benim için gayet iyi görünüyor. Teşekkürler Skip. –

3

Bu kalıtsal özellikleri ile çalışmıyor sadece istemci tarafı doğrulama var. Bunun nedeni, MVC'nin sunucu tarafı özniteliklerini istemci doğrulama davranışlarına eşleme yaparken katı tip eşitliği kullanmasıdır.

public class MyRequiredAttribute : IClientValidatable { 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     yield return new ModelClientValidationRequiredRule(); 
    } 
} 
+1

Yani, neden aynı şekilde MVC2 üzerinde çalışıyor! –

+1

Bu, @SkipHarris'den daha iyi bir işlemdir. RequiredAttributeAdapter kullanmak, özel olan yerine normal Gerekli özniteliği çağırıyor gibi görünüyor. – Keerigan

İlgili konular