2012-05-26 11 views
5

Przeczytałem answers o lokalizacji błędów sprawdzania poprawności, podając DefaultModelBinder.ResourceClassKey, w zasadzie jest to podczas wprowadzania wartości ciąg w polu int, a nie datetime w polu datetime.Lokalizacja dla "wartość {0} jest niepoprawna" w przypadku int przepełnienia

Ale kiedy piszę "111111111111111111111111111111" dla pola int, otrzymuję System.OverflowException i wygląda to na "The value '{0}' is invalid.".

Czy istnieje sposób na zlokalizowanie (przetłumaczenie tej wiadomości na inne języki) tego błędu sprawdzania poprawności w sposób podobny do innego sprawdzania poprawności MVC?

Odpowiedz

3

Miałem ten sam problem iw końcu udało mi się znaleźć rozwiązanie. Tak, ta wiadomość może być zlokalizowana i na szczęście jest to całkiem proste, gdy się go rozgryzie.

Musisz utworzyć plik zasobów i umieścić go w folderze App_GlobalResources. Możesz wywołać plik, który chcesz, ale zazwyczaj nazywam go MvcValidationMessages.

Otwórz plik zasobów i utwórz ciąg znaków o nazwie InvalidPropertyValue i wpisz dowolną treść w polu wartości.

Teraz otwórz plik global.asax i dodaj następującą linię do sposobu Application_Start():

System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey = "MvcValidationMessages"; 

„MvcValidationMessages” oczywiście powinna być prawidłowa nazwa nowo utworzonego pliku zasobów.

I voíla! To wszystko. Wyświetlony komunikat będzie teraz twoim własnym, a nie domyślnym.

+0

To niesamowite, dziękuję! Właśnie sprawdziłem i to działa. :) – Shaddix

+0

Wystarczy wskazać to głośniej ... 'System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey' jest lewą. Dzięki! – Zoka

0

skończyło się nadrzędnymi ModelBinder dla int i dostarczanie zlokalizowaną Komunikat błędu tam:

public class IntModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     double parsedValue; 
     if (double.TryParse(value.AttemptedValue, out parsedValue)) 
     { 
      if ((parsedValue < int.MinValue || parsedValue > int.MaxValue)) 
      { 
       var error = "LOCALIZED ERROR MESSAGE FOR FIELD '{0}' HERE!!!"; 
       bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format(error, value.AttemptedValue, bindingContext.ModelMetadata.DisplayName)); 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Potem po prostu zarejestrował go: ModelBinders.Binders.Add(typeof(int), new IntModelBinder()); i teraz działa poprawnie.

P.S. Oczywiście, moje zlokalizowane erragramy nie są zakodowane na sztywno w segregatorze, to tylko uproszczony przykład :)

Powiązane problemy