Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在MVC3中处理验证-每个复选框组必须选中一个复选框_Jquery_Asp.net Mvc 3_Validation - Fatal编程技术网

Jquery 在MVC3中处理验证-每个复选框组必须选中一个复选框

Jquery 在MVC3中处理验证-每个复选框组必须选中一个复选框,jquery,asp.net-mvc-3,validation,Jquery,Asp.net Mvc 3,Validation,[标题应说明每个问题必须选中一个复选框,但不允许在标题中使用“问题”一词] 简单的问答形式。在一个例子中,有7个问题。在POST上,我的控制器操作需要一个IEnumerable。我的评估问题模型实现了IValidatableObject,我的验证方法如下: public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (this.assessmentAnswers

[标题应说明每个问题必须选中一个复选框,但不允许在标题中使用“问题”一词]

简单的问答形式。在一个例子中,有7个问题。在POST上,我的控制器操作需要一个IEnumerable。我的评估问题模型实现了IValidatableObject,我的验证方法如下:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if (this.assessmentAnswers.Where(e => e.userAnswer == true).Count() == 0)
    {
        yield return new ValidationResult("You must select at least one answer for every question");
        yield break;
    }
}
这在视图级别工作正常-返回错误消息并显示在验证摘要中。问题是,它返回它7次,每个问题一次。目前,我正在使用jQuery评估验证摘要UL&删除重复项,但这似乎是一个黑客行为。我做错了什么

谢谢

[编辑-测试验证结果重载]

事实上,以下是两次调用。但是,它们没有分组,并且仍然显示多个验证错误

if (this.assessmentAnswers.Where(e => e.UserAnswer== true).Count() == 0)
{
    yield return new ValidationResult("You must select at least one answer for every question", new List<string>() { "NoAnswerMarked" });
    yield break;
}
[编辑-查看信息]

@using System.Linq
@using System.Collections.Generic
@model IList<Academy.AssessmentQuestionsModel>

@{
    ViewBag.Title = "TakeAssessment";
    ViewBag.PageID = "TakeAssessment";
}
@section TitleBar {
    <span>
    @if(ViewBag.Status == "questions") {    
        <text>Take Assessment</text>
    } else {
        <text>Assessment Response</text>
    }
    </span>
}
@section JS {
<script type="text/javascript">
    $(function () {
        if ($(".validation-summary-errors li:contains('You must select at least one answer for every question')").length > 0) {
            $(".validation-summary-errors ul")
                .find("li:contains('You must select at least one answer for every question')")
                .remove()
                .end()
                .append("<li>You must select at least one answer for every question</li>");
        }
        $("#asubmit").click(function (e) {
            var hasErrors = false;
            $(".newAnswerWrapper").each(function () {
                if ($(this).find('input[type="checkbox"]:visible:checked').length == 0) {
                    e.preventDefault();
                    hasErrors = true;
                    return false;
                }
            });
            if (hasErrors) {
                $(".validation-summary-valid").find("ul").append("<li>You must select at least one answer for every question</li>").end().show();
            } else {
                $(".validation-summary-errors").find("li:contains('You must select at least one answer for every question'')").remove().end().hide();
            }
        });
    });
</script>
}
@using (Html.BeginForm())
{
    @Html.ValidationSummary(false)
<fieldset>
    <legend></legend>
    <div class="takeAssessment">
    @if(!string.IsNullOrEmpty(ViewBag.AssessmentInstructions)) {
        <h4>Instructions</h4>
        <p>@ViewBag.AssessmentInstructions</p>
    }
    @{
    int questionCount = 0;
    int totalQuestions = Model.Count();

    @Html.Hidden("ModuleID", (int)ViewBag.ModuleID)
    for (var i = 0; i < Model.Count; i++)
    {

        @Html.HiddenFor(m => m[i].questionDescription)
            <div class="newQuestionWrapper">
                    <h4>Question @(i + 1) of @totalQuestions</h4>
                    @Html.HiddenFor(m => m[i].assessmentID)
                    @Html.HiddenFor(m => m[i].assessmentQuestionID)
                    <p class="questionDescription">@Model[i].questionDescription</p>
                    <div class="newAnswerWrapper"></div>

                <div class="newAnswerWrapper">
                    <div class="answerHeader">
                        <p class="correct">Select</p><p class="answers">Answer(s)</p>
                    </div>

                 @for (var j = 0; j < Model[i].assessmentAnswers.Count(); j++)
                 {
                    @Html.HiddenFor(m => m[i].assessmentAnswers[j].assessmentAnswerID)
                    @Html.HiddenFor(m => m[i].assessmentAnswers[j].assessmentQuestionID)
                    @Html.HiddenFor(m => m[i].assessmentAnswers[j].assessmentAnswer)

                     if (ViewBag.Status == "questions")
                     {          
                         <div class="answerRow">
                            <span class="isAnswer first">@Html.CheckBoxFor(m => m[i].assessmentAnswers[j].userAnswer)</span>
                            <span class="answerDisplay">@Html.DisplayFor(m => m[i].assessmentAnswers[j].assessmentAnswer)</span>
                            @Html.HiddenFor(m => m[i].assessmentAnswers[j].isAnswer)
                            <div class="clear"></div>
                         </div>
                     }
                     else
                     {
                        <div class="answerRow">
                            @{
                                string cls = Model[i].assessmentAnswers[j].isAnswer ? "correct" : "incorrect";
                            }
                            <span class="isAnswer first">@Html.CheckBoxFor(m => m[i].assessmentAnswers[j].userAnswer, new { @disabled = "disabled" })</span>
                            <span class="answerDisplay" style="width: 510px !important;">@Html.DisplayFor(m => m[i].assessmentAnswers[j].assessmentAnswer)</span>
                            <span class="isAnswer"><span class="@cls">@Html.DisplayFor(m => m[i].assessmentAnswers[j].isAnswer)</span></span>

                            <div class="clear"></div>
                        </div>
                     }
                     <div class="clear"></div>
                 }

              </div>

    <div class="clear"></div>
            </div>
    }
}

    <div class="clear"></div>
    </div>
    @if (ViewBag.Status == "questions")
    {
    <input type="submit" id="submit" value="Submit Assessment" class="redButton197x38" />
    }
</fieldset>
}
<p>
    @Html.ActionLink("Back to Module", "Learn", new { id = ViewBag.ModuleID }, new { @class = "redButton197x38" })
</p>

我一直在考虑你的问题,我认为这个问题比我想的要简单得多,ValidationResult类有一个重载构造函数,如果你传入相同的键新列表{QuestionError},它会要求传入成员名在这里,它应该对它们进行分组,并且只显示一个结果。

您可以在这里添加视图信息吗?在此期间,您说您正在通过jQuery删除重复项-您也可以在ModelState对象中的控制器中执行此操作,现在测试您的答案。