/ / Nie można sprawdzić poprawności wybranego wyboru za pomocą jQuery Validate (nie dyskretne) [duplikat] - jquery, asp.net-mvc-4, jquery-validate, jquery-selected

Nie można sprawdzić poprawności wybranego wyboru za pomocą jQuery Validate (nie dyskretne) [duplikat] - jquery, asp.net-mvc-4, jquery-validate, jquery-selected

Próbuję dokonać prostej walidacji DropDownList (wyczyść jQuery - nie rzuca się w oczy) w mojej aplikacji ASP.NET MVC 4.

Mam pola w modelu:

[DisplayName("Wybierz płatnika")]
public virtual int? studyPayerId { get; set; }
public virtual IList<StudyPayer> PayersList { get; set; }

Następnie w kontrolerze wykonuję:

var payers = RisDbPersistanceManager.RetrieveEquals<StudyPayer>("IsActive", true);
if (payers != null)
{
model.PayersList = payers;  // it is populated
}
model.studyPayerId = null;

I moim zdaniem:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>

...

$("#studyPayerId").rules("add",
{
required: true,
messages: {
required: "Proszę wybrać płatnika!"
}
});
...
<div class="formsElement" >
<div class="formsElementLabel" >
@Html.LabelFor(x => x.studyPayerId)
</div>
<div class="formsElementInput" >
@Html.DropDownListFor(x => x.studyPayerId, new SelectList(Model.PayersList, "Id", "Name", Model.studyPayerId), "-- wybierz płatnika --")
@Html.ValidationMessageFor(x => x.studyPayerId)
</div>
</div>

W prostych polach TextBox wszystko działa -zatwierdza moje pole po kliknięciu przycisku Prześlij. Ale DropDownList nie wyświetla żadnej wiadomości, gdy nic nie wybrałem i zostawiam opcję „- wybierz płatnika -”.

EDYTOWAĆ

  <select id="Gender" class="error" name="Gender" style="display: none;">
<label class="error" for="Gender">Proszę wybrać płeć!</label>
<div id="Gender_chosen" class="chosen-container chosen-container-single chosen-container-single-nosearch" style="width: 127px;" title="">
<a class="chosen-single" tabindex="-1">
<span>-- nieokreślona --</span>
<div>
</a>
<div class="chosen-drop" style="top: 34px; bottom: auto;">
</div>

Odpowiedzi:

2 dla odpowiedzi № 1
  1. To jest JavaScript, więc musisz nam pokazać RENDEROWANE i odpowiedni kod HTML widziany przez przeglądarkę, a nie model, widok lub kontroler. Ponieważ nie widzę renderowanego kodu HTML, w poniższym kodzie demonstracyjnym używam nazw ogólnych.

    • Pierwszy option element musi mieć value="" atrybut.
    • The select element musi mieć name atrybut, nawet jeśli go nie używasz.

  2. Nie widzę twojego wezwania do .validate() metoda. Wtyczka musi najpierw zainicjuj za pomocą .validate() metoda. Nie możesz użyć .rules() metoda bez tego.

jQuery:

$(document).ready(function () {

$("#myform").validate(); // <- INITIALIZE plugin

$("#studyPayerId").rules("add", {
required: true,
messages: {
required: "Proszę wybrać płatnika!"
}
});

});

Renderowany HTML:

<form id="myform">
<select name="myselect" id="studyPayerId">
<option value="">-- wybierz płatnika --</option>
<option value="1">option 1</option>
</select>
<br/>
<input type="submit" />
</form>

Praca DEMO: http://jsfiddle.net/nwLqdemu/


Nie rozumiem, dlaczego używasz .rules() metoda. Zwykle używa się tego tylko wtedy, gdy reguły trzeba dodać i usunąć dynamicznie; lub gdy reguły zostaną zastosowane jednocześnie do całej grupy elementów, ponieważ byłoby to zbyt długie, aby można je było uwzględnić w .validate() metoda.

W przeciwnym razie po prostu zadeklarujesz reguły w .validate() metoda przy inicjalizacji ...

$(document).ready(function () {

// INITIALIZE plugin

$("#myform").validate({
rules: {
myselect: {  // <- NAME attribute
required: true
}
},
messages: {
myselect: {  // <- NAME attribute
required: "Proszę wybrać płatnika!"
}
}
});

});

Działająca DEMO 2: http://jsfiddle.net/nwLqdemu/1/


Zobacz stronę SO Tag Wiki, aby uzyskać podstawowe demo i wskazówki dotyczące prawidłowego użytkowania.


EDYTOWAĆ:

Ponieważ nigdy nie wspominałeś o użyciu „Wybrańców”wtyczka do tworzenia listy rozwijanej, nie ma możliwości, aby ktokolwiek mógł odpowiedzieć na to pytanie. Ponieważ jednak wtyczka jQuery Validate domyślnie ignoruje ukryte elementy, musisz zmienić ignore opcja do [] aby „nic nie ignorować” i potwierdzić element ukryty przez Chosen.