2013-03-07 10 views
6

Jak zlokalizować wiadomości typu danych w MVC4 "Pole Data musi być datą."Jak zlokalizować typy danych?

<input data-val="true" data-val-date="The field Date be a date." id="Date" name="Date" value="" > 

I używając:

public class LocalizedDataTypeAttributeAdapter : DataAnnotationsModelValidator<DataTypeAttribute> 

     { 
      public LocalizedDataTypeAttributeAdapter(ModelMetadata metadata, ControllerContext context, DataTypeAttribute attribute) : base(metadata, con 

text, attribute) 
     { 
      attribute.ErrorMessageResourceType = typeof(Localization.Global); 
      attribute.ErrorMessageResourceName = "PropertyDataFormat"; 
     } 

    } 

także LocalizedDataTypeAttributeAdapter zarejestrować w Global.asax

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DataTypeAttribute), typeof(LocalizedDataTypeAttributeAdapter)); 

Odpowiedz

1

trzeba przepisać ClientDataTypeModelValidatorProvider

Take it https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Mvc/ClientDataTypeModelValidatorProvider.cs

i zmienić

private static string GetUserResourceString(ControllerContext controllerContext, string resourceName) 
     { 
      string result = null; 

      if (!String.IsNullOrEmpty(ResourceClassKey) && (controllerContext != null) && (controllerContext.HttpContext != null)) 
      { 
       //result = controllerContext.HttpContext.GetGlobalResourceObject(ResourceClassKey, resourceName, CultureInfo.CurrentUICulture) as string; 
       result = GlobalRes.ResourceManager.GetString(resourceName); 
      } 

      return result; 
     } 

Następnie ustawić go jako DefaultModelBinder podczas Application_Start w Global.asax:

protected void Application_Start() 
{ 

    var existingProvider = ModelValidatorProviders.Providers.Single(x => x is ClientDataTypeModelValidatorProvider); 
    ModelValidatorProviders.Providers.Remove(existingProvider); 
    ModelValidatorProviders.Providers.Add(new myClientDataTypeModelValidatorProvider()); //!! 
    myClientDataTypeModelValidatorProvider.ResourceClassKey = typeof(GlobalRes).Name; 
    DefaultModelBinder.ResourceClassKey = typeof(GlobalRes).Name; 
} 
+0

Czym jest odniesienie GlobalRes? I referencje MvcResources? Powiedz mi proszę. A także jesteś smutny "Po tym piszesz w Global.asax" JAKĄ METODĘ? Bardzo zła sugestia. –

+1

@ CanÜrek GlobalRes wydaje się być nazwą klasy zasobów, identyczną z nazwą pliku zasobów. Tak więc w tym przypadku plikiem * .resx będzie "GlobalRes.resx". Zastąp 'GlobalRes' nazwą swojej klasy zasobów. –

+0

Ale niezależnie od tego nie działa w MVC 5, nie znalazłem jednego działającego rozwiązania, aby uzyskać lokalizację komunikatów sprawdzania poprawności, przynajmniej dla komunikatu o błędzie daty. Ten wydaje się być zakodowany na sztywno. Dobra robota. –