0

私はメインビューと部分ビューを持っています:

// // GET: /質問/追加/

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モデルの多くのオブジェクトで処理できないという私の問題は、ループから最初のtextBoxを取得し、forそれをすべての部分ビューの検証に使用することです。クライアント側で 1 つのモデルから多くのオブジェクトを適切に検証することは可能ですか?

4

1 に答える 1

1

ここでの問題は、テキストボックスの名前にありAnswerTextます。それらはすべて同じ名前であり、目立たないクライアント側の検証フレームワークは、どのアイテムをアタッチするかを決定しません。したがって、最初のものにアタッチするだけです。

Steven Sandersonが、コレクションアイテムのインデックスにGuidを使用してfollowing articleいるという素敵な小さなヘルパーを示しているところを確認することをお勧めします。Html.BeginCollectionItemこれにより、クライアント側の検証が適切に機能するようになります。

于 2013-01-11T17:08:02.913 に答える