18

Mam RangeValidator na właściwości w moim modelu, aby zezwalać tylko na wartości całkowite od 0 do 100. Mam częściowy widok, który wyświetla formularz aktualizujący właściwość poprzez okno dialogowe interfejsu użytkownika jQuery . Przyjrzałem się źródłu i mogę potwierdzić, że atrybuty adnotacji danych są generowane poprawnie. Jednak walidacja nie działa poprawnie. Wykonuje jakąś walidację, ale nie korzysta z ustawionego zakresu. Wartości 1, 10 i 100 nie powodują błędu. Każda inna pojedyncza lub dwucyfrowa wartość powoduje błąd. Jeśli jednak wypełniam zera, wszystkie wartości mniejsze niż sto są w porządku.Sprawdzanie poprawności zakresów danych MVC nie działa poprawnie

Model:

public class MyModel 
{ 
    ... 
    [Required(ErrorMessage = "{0} is required")] 
    [Range(typeof(int), "0", "100", 
     ErrorMessage = "{0} can only be between {1} and {2}")] 
    public int Percentage { get; set; } 
    ... 
} 

Częściowy Widok:

@model MyApp.Models.Partials.MyModel 

<div id="myDialog" class="editModal" title="Update Percentage"> 
    @using (Ajax.BeginForm("UpdatePercentage", "MyController", 
         new AjaxOptions() { HttpMethod = "Post", 
              OnSuccess = "onUpdateSuccess" }, 
         new { name = "myForm" })) 
    { 
    @Html.ValidationSummary(null, new { style = "width:auto;max-width:22em;    
               float:left;clear:both;" })  
    <div style="width:auto;float:left;clear:both;"> 
     <div style="width:10em;float: left;text-align:right;clear:left;"> 
     @Html.Label("Percentage:") 
     </div> 
     <div style="width:12em;margin-left:1em;float:left;clear:right;"> 
     @Html.TextBoxFor(m => m.Percentage) 
     </div> 
    </div> 
    <div style="width:23em;clear:both;text-align:center;"> 
     <hr /> 
     <input type="button" value="Cancel" class="cancelModalButton" 
      data-modal="myDialog" /> 
     <input type="submit" value="Submit" class="submitModalButton" 
      data-modal="myDialog" data-form="myForm" /> 
    </div> 
    } 
</div> 

Markup produkowane:

<div id="myDialog" class="editModal" title="Update Percentage"> 
    <form action="/Web/MyController/UpdatePercentage?Length=3" 
     data-ajax="true" data-ajax-method="Post" data-ajax-success="onUpdateSuccess" 
     id="form2" method="post" name="myForm"> 
    <div class="validation-summary-valid" data-valmsg-summary="true" 
     style="width:auto;max-width:22em;float:left;clear:both;"> 
     <ul> 
     <li style="display:none"></li> 
    </ul> 
    </div> 
    <div style="width:auto;float:left;clear:both;margin-bottom:.75em;"> 
     <div style="width:10em;float: left;text-align:right;clear:left;"> 
     <label for="Percentage:">Percentage:</label> 
     </div> 
     <div style="width:12em;margin-left:1em;float:left;clear:right;"> 
     <input data-val="true" data-val-number="The field Percentage must be a number." 
       data-val-range="Percentage can only be between 0 and 100" 
       data-val-range-max="100" data-val-range-min="0" 
       data-val-required="Percentage is required" id="Percentage" 
       name="Percentage" type="text" value="10" /> 
     </div> 
    </div> 
    <div style="width:23em;clear:both;text-align:center;"> 
     <hr /> 
     <input type="button" value="Cancel" class="cancelModalButton" data-modal="myDialog" /> 
     <input type="submit" value="Submit" class="submitModalButton" data-modal="myDialog" data-form="myForm" /> 
    </div> 
    </form> 
</div> 

widzę, że typ jest ustawiony na text, a jeśli zmienię TextBoxFor do EditorFor to chnages do number, ale wciąż zobacz to samo zachowanie.

+0

jest to problem z łamaniem zmian w jquery, zobacz: http://stackoverflow.com/questions/14889431/client-side-validation-trips-on-dataannotation -range-atrybut – felickz

Odpowiedz

7

Miałem dokładnie ten problem i znalazłem rozwiązanie here. Musisz uaktualnić następujące:

jQuery Validation (przynajmniej 1.11.1)
Microsoft jQuery Dyskretna Validation (przynajmniej 2.0.30116.0)
Microsoft Ajax jQuery Dyskretna (przynajmniej 2.0.30116.0)

Problem został wprowadzony przez zerwanie zmian w jQuery 1.9.1

+0

To się stało problemem, jak Felix wskazywał na komentarz jakiś czas temu, ale skoro jesteś pierwszym, który zaproponował to jako oficjalną odpowiedź, dam ci kredyt, który oznaczy go jako rozwiązany. – stopher

+0

Dzięki. Zacząłem tutaj i podążałem za linkiem felickza ... potem podążyłem za linkiem do wydania na GitHub ... następnie przewinąłem do komentarza, który stwierdził, że jQuery Validation 1.11.1 naprawił to ... więc pomyślałem, że to zrobię trochę łatwiejsze dla każdego, kto nadejdzie – Colin

3

Wypróbuj [Range(0, 100)]. Całkowicie usuń ErrorMessage, aby zobaczyć, że nic nie zrywasz z nieprawidłowym formatowaniem i nawiasami klamrowymi.

Jeśli czysty zakres nie działa prawidłowo, pozwól, aby siła (MS) była z tobą! :)

+0

Zrobione. Ten sam błąd. Usunięto wszystkie inne właściwości z Modelu, usunięto adnotację 'Wymagane', zmieniono' Zakres' na dokładnie to, co tu masz. Wziąłem nawet formę i przeniosłem ją z widoku "Częściowego" i nie stanowiłem już okna dialogowego. Ten sam błąd. Potem wziąłem adnotacje danych z równania. Wziąłem znacznik dla generowanego wejścia i podłączyłem go bezpośrednio do strony zamiast generować ją z mojego modelu. Ten sam błąd. – stopher

+1

W tej chwili potrzebujesz * siły *, aby być z Tobą :) Zacznę komentować fragmenty kodu, aby wyizolować problem. Ponieważ 'Range' działa do końca, nie ma z tym problemu, myślę, że może to być niezgodność konfliktów lub wersji, ale nie oczekuję, że ludzie na forum zdalnie zdadzą ci to za sobą. Wystarczy wyizolować problem. Innym sposobem działania (jeśli nie masz jeszcze zbyt wiele kodu) będzie po prostu stworzenie nowego rozwiązania i przeniesienie tam kodu przez części sprawdzające za każdym razem, gdy wprowadzisz coś nowego, że 'Range' nadal działa. Mam nadzieję że to pomoże. –

+1

Naprawdę doceniam twoją pomoc, ale zdecydowałem się po prostu wstrzymać i użyć walidatora RegularExpression, który jest tak samo opłacalny w mojej sytuacji. Spędziłem za dużo czasu. Przypuszczam, że MS wygrywa w tej rundzie ... – stopher

Powiązane problemy