私はjQuery UI MultiSelect Widgetを使用しています。少なくとも1つの値を選択する必要があるという点で、複数選択を必要とします。複数選択が非表示になっていることを理解しています。そのため、検証するだけでなく、検証で非表示を無視してコントロールを検証する際に問題が発生するのはそのためです。これが私のビューコードです。
<div class="editor-field">
@Html.ListBoxFor(model => model.SelectedItems,new MultiSelectList(Model.AvailableDistributionEntities, "Value", "Text", Model.SelectedItems),new {@class = "multiselect ", id="mySelect", name="mySelect", style ="width:50%;"})
@Html.ValidationMessageFor(x => x.SelectedItems)
</div>
<script type="text/javascript">
$.validator.addMethod("needsSelection", function (value, element) {
return $(element).multiselect("getChecked").length > 0;
});
$.validator.messages.needsSelection = 'Please select at least one email distribution list.';
jQuery.validator.unobtrusive.adapters.add("needsSelection", [], function (options) {
options.rules["needsSelection"] = true;
options.messages["needsSelection"] = options.message;
});
</script>
これは bootbox.dialog 内の部分的なビューであるため、送信コールバックで検証を行っています。そのコントロールを検証していない理由がわかりません。
label: "Send",
className: "btn-primary btn-xs",
callback: function () {
var $form = $('#form');
//Validating the form using unobtrusive validation.
$.validator.unobtrusive.parse($form);
$("#form").validate({
// options
rules: {
"needsSelection": "required",
},
ignore: ':hidden:not(.multiselect)'
});
if ($("#form").valid()) {
$.ajax({
cache: false,
url: "/Email/Distribute",
type: 'POST',
//Serializing the form data to pass to the edit action.
data: $("#form").serialize(),
success: function (res) {
if (res.success) {
//Refreshing the event schedule edit screen by navigating to it.
navigateTo(res.url);
} else {
alert("Error occurred while saving.");
}
}
});
} else {
return false;
}
}