5

Moja walidacja walidacji zawsze kończy się niepowodzeniem na liście rozwijanej z wartością ciągu znaków.MVC DropDownListFor i atrybut StringLength nie grają dobrze razem

Oto mój model:

[Required(ErrorMessage = "Required")] 
[StringLength(2, MinimumLength = 2)] 
[Display(Name = "Home Address State")] 
public string HomeAddressState { get; set; } 

Oto mój widok:

@Html.DropDownListFor(model => model.HomeAddressState, new SelectList(ViewBag.States, "Value", "Text"), string.Empty) 
@Html.ValidationMessageFor(model => model.HomeAddressState) 

Oto wyjściowy html:

<select data-val="true" data-val-length="The field Home Address State must be a string with a minimum length of 2 and a maximum length of 2." data-val-length-max="2" data-val-length-min="2" data-val-required="Required" id="HomeAddressState" name="HomeAddressState"><option value=""></option> 
<option value="CA">California</option> 
<option value="IL">Illinois</option> 
<option value="IN">Indiana</option> 
<option value="OH">Ohio</option> 
</select> 

Bez względu na to, która opcja jest zaznaczona, StringLength Sprawdzanie poprawności nie działa po stronie klienta. Co robię nieprawidłowo?

+1

Dlaczego potrzebujesz sprawdzania wartości StringLength dla rozwijanej listy? – Jesse

+1

prawdopodobnie dlatego, że jego walidacja modelu danych jest (poprawnie) niezależna od jego widoku klienta. – bhamlin

+0

bhamlin jest poprawny. Używam [StringLength (2, MinimumLength = 2)], aby poprawnie utworzyć pole char (2) w mojej bazie danych, ponieważ używam najpierw kodu. Nie chciałem płynąć płynnie. –

Odpowiedz

0

ponieważ StringLength zasada rangelength zasada w jquery.validate. W przypadku listy wyboru sprawdzi liczbę wybranych elementów, a nie długość wybranej wartości, więc jeśli napiszesz regułę o minimalnej długości 1, zadziała

6

Oto odpowiedni kod walidacji jquery. Jak widać, wygląda na to, że stosuje sprawdzanie długości do liczby wybranych opcji, a nie do długości opcji. Wygląda na to, że stosuje się tylko do wielu list wyboru. Coś dziwnego, szczerze mówiąc.

maxlength: function(value, element, param) { 
    return this.optional(element) || this.getLength($.trim(value), element) <= param; 
} 

getLength: function(value, element) { 
    switch(element.nodeName.toLowerCase()) { 
     case 'select': 
      return $("option:selected", element).length; 
     case 'input': 
      if(this.checkable(element)) 
       return this.findByName(element.name).filter(':checked').length; 
    } 
    return value.length; 
} 

Co można zrobić, to zastąpić funkcję getLength sobie po prostu wrócić value.length bezpośrednio.

$.validator.prototype.getLength = function (value, element) { 
    return value.length; 
} 
+1

Dzięki. Gdzie powinienem umieścić ten kod? –

+0

Wszędzie po włączeniu biblioteki sprawdzania poprawności jquery. – bhamlin

+0

Tak myślałem, ale nie ma kości. Domyślne zachowanie przeważa moje nadpisanie. Zastanawiam się, w jaki sposób tworzona jest biblioteka sprawdzania poprawności. Wygląda na to, że to leniwy ładunek. W $ (document) .ready() Zapytałem $ .validator.methods.getLength i jest to wartość null. –

2

Aby uniknąć zerwania logikę wyboru i wielu selectboxes, można użyć:

$.validator.prototype.getLength = function (value, element) { 
    switch (element.nodeName.toLowerCase()) { 
     case 'select': 
      { 
       var attr = $(this).attr('multiple'); 
       // For some browsers, `attr` is undefined; for others, 
       // `attr` is false. Check for both. 
       if (typeof attr !== 'undefined' && attr !== false) { 
        return $("option:selected", element).length; 
       } 
      } 
     case 'input': 
      if (this.checkable(element)) 
       return this.findByName(element.name).filter(':checked').length; 
    } 
    return value.length; 
} 

OSTRZEŻENIE: Przetestowałem to tylko na DropDownFor, więc używać na własne ryzyko ....

Powiązane problemy