ASP.NET MVC 4 IEnumerable <mymodel>客户端验证</mymodel>

时间:2013-01-11 17:00:34

标签: asp.net-mvc jquery asp.net-mvc-4

我有主要观点和部分观点:

//     // GET:/ Question / Add /

public ActionResult Add()
{
    return View();
}

//
// Post: /Question/GetAnswerContainers/
[HttpPost]
public ActionResult GetAnswerContainers(int count)
{
    ViewBag.AnswerCount = count;
    return PartialView();
}

主要观点很简单:

@using (@Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <fieldset>
        <legend>Add Question Form</legend>


        <div id="question_answers">
            @Html.LabelFor(m => m.AnswerCount)
            @Html.TextBoxFor(m => m.AnswerCount, 
              new {
                      @class = "answer_count", 
                      action = @Url.Action("GetAnswerContainers")
                  })<br/>
            @Html.ValidationMessageFor(m => m.AnswerCount)<br/>

            <div id="answers"></div>
        </div>

        <input type="submit" value="Add" />
    </fieldset>
}

我的文本框也有jQuery:

$(function () {
    $('#question_answers input[type="text"].answer_count').keyup(function () {
        var answerCount = $(this).val();
        if (isNaN(answerCount))
            return;            

        $.ajax({
            type: 'POST',
            data: { count: $(this).val() },
            url: $(this).attr("action"),
            timeout: 2000,
            async: false,
            success: function (data) {
                removeAnswers();
                addAnswers(data);

                $('form').removeData('validator');
                $('form').removeData('unobtrusiveValidation');
                $.validator.unobtrusive.parse('form');
            },
            error: null
        });
    });
});

function addAnswers(data) {
    var answersContainer = $('#question_answers #answers');    
    answersContainer.append($((data)));
}

部分观点:

@model Quiz.Models.Question.QuestionAnswer

@Html.LabelFor(m => m.AnswerText)
@for (var i = 0; i < ViewBag.AnswerCount; i++)
{
    @Html.TextBoxFor(m => m.AnswerText) 
    @Html.ValidationMessageFor(m => m.AnswerText)       
}

型号:

public class QuestionAnswer
{
    [Required]
    [Display(Name = "Answers")]
    public string AnswerText { get; set; } 
}

所以我的问题是标准的asp.net客户端验证无法处理QuestionAnswer模型的许多对象,它从for循环获取第一个textBox并用它来验证所有局部视图。 是否可以在客户端正确验证来自一个模型的许多对象?

1 个答案:

答案 0 :(得分:1)

此处的问题是AnswerText文本框的名称。它们都具有相同的名称,不显眼的客户端验证框架不会如何附加项目。所以它只是附加到第一个。

我建议你浏览following article,其中Steven Sanderson演示了一个名为Html.BeginCollectionItem的好帮手,它使用Guids作为收集物品的索引。这将允许客户端验证正常工作。