2012-09-22 21 views
21

Dodanie pliku zasobów do App_GlobalResources z kluczem PropertyValueRequired i zmieniając DefaultModelBinder.ResourceClassKey do nazwy pliku nie ma wpływu na MVC 4. Ciąg The {0} field is required nigdy nie ulegnie zmianie. Nie chcę ustawiać typu klasy zasobów i klucza w każdym wymaganym polu. Czy czegoś brakuje?MVC 4 ignoruje DefaultModelBinder.ResourceClassKey

Edit:

Zrobiłem małą modyfikację na kodzie Darin Dimitrov, aby zachować Wymagane opcje dostosowania pracy:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public MyRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
     { 
      attribute.ErrorMessageResourceType = typeof(Messages); 
     } 
     if (attribute.ErrorMessageResourceName == null) 
     { 
      attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
     } 
    } 
} 

Odpowiedz

39

To nie jest specyficzna dla ASP.NET MVC 4. To był to samo w ASP.NET MVC 3. Nie można ustawić wymaganego komunikatu za pomocą DefaultModelBinder.ResourceClassKey, tylko PropertyValueInvalid.

Jednym ze sposobów, aby osiągnąć to, czego szukasz jest zdefiniowanie niestandardowego RequiredAttributeAdapter:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public MyRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) : base(metadata, context, attribute) 
    { 
     attribute.ErrorMessageResourceType = typeof(Messages); 
     attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
    } 
} 

że będzie zarejestrować w Application_Start:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute), 
    typeof(MyRequiredAttributeAdapter) 
); 

Teraz, gdy pole nie pustych nie jest przypisana wartość, komunikat o błędzie będzie pochodzić z Messages.PropertyValueRequired, gdzie Messages.resx musi być zdefiniowany wewnątrz App_GlobalResources.

+0

Idealny! Zrobiłem wiele badań i nie znalazłem nic podobnego. Dziękuję Ci bardzo. – Eduardo

+0

@DarinDimitrov, twoja odpowiedź jest wspaniała, dziękuję .... – RAM

+0

Czy można zrobić coś podobnego do sprawdzania poprawności typu, np. na daty? – Rowan