2011-05-21 15 views
6

Pracuję nad zlokalizowaną aplikacją webową mvc3 za pomocą dyskretnego sprawdzania poprawności. W web.config mam:mvc3 jquery dyskretne sprawdzanie poprawności ustawień narodowych

<globalization culture="pl-PL" uiCulture="pl" /> 

jQuery 1.4.4 i jQuery Walidacja 1.6 jest w użyciu.

Problem ma postać separatora liczb dziesiętnych.

Widzę, że walidacja jquery ignoruje kulturę i spodziewa się, że znak kropki będzie zawsze separatorem dziesiętnym. Potrzebuję zamiast tego użyć przecinka. Myślę, że to samo w języku niemieckim na przykład.

tworzę własny plik methods_pl.js:

jQuery.extend(jQuery.validator.methods, { 
number: function(value, element) { 
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value); 
} 
}); 

powyżej rozwiązania podstawowego problemu, gdzie liczba dziesiętna nie jest rozpoznawany w ogóle.

Ale kiedy próbuję użyć RangeAttribute na moim modelu Decimal Price, to nadal nie działa. Jak rozwiązać ten problem?

+0

Zobacz moją odpowiedź tutaj. Możesz znaleźć swoje rozwiązanie! http://stackoverflow.com/questions/9204855/cant-get-the-jquery-globalization-to-work/9221040#9221040 – Rushino

Odpowiedz

1

Phil Haack opublikował kilka informacji na temat tego problemu.

See here.

W post on terminy aktualnie wyświetlanej w następujący sposób:

using System; 
using System.Globalization; 
using System.Web.Mvc; 

public class DecimalModelBinder : IModelBinder { 
    public object BindModel(ControllerContext controllerContext, 
    ModelBindingContext bindingContext) { 
    ValueProviderResult valueResult = bindingContext.ValueProvider 
     .GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try { 
     actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
      CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
    } 
} 

a następnie w Global.asax

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 

Nie jestem pewien, czy to rozwiąże problem na również klient (Phil wydaje się wskazywać, że to zadziała), ale powinien rozwiązać problem po stronie serwera.

+0

jeśli strona klienta ma inną kulturę niż strona serwera, to masz problem nawet z tym kodem –

+0

Ustawiam kulturę i uiCulture w web.config jak thie: - czy ustawienie kultury po stronie serwera i po stronie klienta jest właściwe? – mb666

+0

Powyżej funkcji DecimalModelBinder działa dobrze dla mnie. Jakąkolwiek wskazówkę dlaczego w valueResult.Culture.NativeName jest "język niezmienny (niezmienny)"? To jest prawdopodobnie źródło mojego problemu. Jeśli DefaultModelBinder nie używa mojej kultury PL-PL, to nie zadziała. Jak ustawić poprawną kulturę dla DefaultModelBinder? – mb666

4

Jeśli ustawisz

key="UnobtrusiveJavaScriptEnabled" value="false" 

DecimalModelBinder pisał w poprzedniej odpowiedzi będzie działać, ale są wyłączenie walidacji clien siebie.

Aby rozwiązać problem, należy uwzględnić poprawne ustawienia narodowe jQuery. Spójrz na this post from Scott Hanselmann lub this post powinny ci pomóc w jego implementacji.

Należy dodać Nuget formularz wtyczki Jquery.globalize następnie w domready funkcji dodać coś takiego mieć numer zweryfikowane poprawnie (przynajmniej u mnie działa)

$.validator.methods.number = function (value, element) { 
     if (Globalize.parseFloat(value)) 
      return true; 
     return false; 
    } 
Globalize.culture('fr-FR'); 

następnie dodać względne skryptów w swojej strona

Powiązane problemy