MVC4 Jquery验证复选框至少选中一个

MVC4 Jquery validate checkbox to check at least one?

本文关键字:一个 验证 Jquery 复选框 MVC4      更新时间:2023-09-26

我正在实现一个让用户选择的复选框问题。但是,如果管理员将问题强制设置为true,则复选框必须选择至少1才能提交,否则将提示用户选择。试过jquery,但是当点击按钮时,什么也没发生。

我有什么错误吗?

我的观点:

    @model List<IFXSurveyTool.Models.AnswerQuestionViewModel>
    <script>
            var messageContainer = $('.errormessage');
            $('#save').click(function () {
                // Get all mandatory containers
                var mandatory = $('.mandatory');
                $.each(mandatory, function () {
                    var numChecked = $(this).find('input:checked').length;
                    if (numChecked === 0) {
                        messageContainer.text('At least one checkbox must be selected.');
                        return false;
                    }
                });
            });
            $('.mandatory').on('click', 'input[type="checkbox"]', function () {
                messageContainer.text('');
            });

    </script>
    <br />
    <h2>Questions</h2>
    <br />
    @using (Html.BeginForm())
    {
        <div class="errormessage"></div>
           <div class="checkboxcontainer mandatory">
              @for (int x = 0; x < Model[i].Choice_SubQuestion.Count(); x++)
                  {

                           <input type="checkbox" name="[@i].MultiAnswer[@x]" value="@Model[i].Choice_SubQuestion[x]" />
                           @Html.HiddenFor(m => m[i].MultiAnswer[x])
                           @Html.LabelFor(m => m[i].MultiAnswer[x], Model[i].Choice_SubQuestion[x].ToString(), new { @class = "questionlist1" })

         }
  </div>
    <button type="button" id="save">Save</button> 
}

在HTML中生成复选框后:

<div class="checkboxcontainer mandatory">
<input type="checkbox" name="[0].MultiAnswer[0]" value="1">
<input name="[0].MultiAnswer[0]" type="hidden" value="">
<label class="questionlist1" for="">1</label>
<input type="checkbox" name="[0].MultiAnswer[1]" value="2">
<input name="[0].MultiAnswer[1]" type="hidden" value="">
<label class="questionlist1" for="">2</label>
<input type="checkbox" name="[0].MultiAnswer[2]" value="3">
<input name="[0].MultiAnswer[2]" type="hidden" value="">
<label class="questionlist1" for="">3</label>
</div>

首先,你给所有包含<div>的元素class="mandatory",如果Model[i].Mandatorytrue,只生成复选框,所以你的html应该是

for (int x = 0; x < Model[i].Choice_SubQuestion.Count; x++)
{
  @{var attributes = Model[i].Mandatory ? "checkboxgroup mandatory" : "checkboxgroup";}
  <div class="@attributes">
    <div class="message></div>
    <input type="checkbox" name="[@i].MultiAnswer[@x]" value="@Model[i].Choice_SubQuestion[x]" />
    @Html.HiddenFor(m => m[i].MultiAnswer[x])
    @Html.LabelFor(m => m[i].MultiAnswer[x], Model[i].Choice_SubQuestion[x].ToString(), new { @class = "questionlist1" })
  </div>
}
<input value="Submit" type="submit" class="btn" id="save" />

接下来,您的按钮是一个提交按钮,因此表单实际上正在提交(在错误消息有机会变得可见之前)。将脚本更改为

$('#save').click(function() {
  var canSubmit = true;
  // Get all mandatory containers
  var mandatory = $('.mandatory');
  $.each(mandatory, function() {
    var numChecked = $(this).find('input:checked').length;
    if (numChecked === 0) {
      canSubmit = false; // signal we can't submit
      // display error message;
      $(this).children('.message').text('At least one checkbox must be selected');
      return false; // exit the loop
    }
  });
  if (!canSubmit) {
    return false; // cancel the default submit
  }
});
$('.mandatory').on('click', 'input[type="checkbox"]', function() {
  $(this).closest('.mandatory').children('.message').text(''); // clear any existing error message
});

还要注意,脚本必须在页面的底部(紧接结束的</body>标记之前)或包装在$(document).ready() { ..... }$(function() { ..... });(简写版本)。