2013-01-11 53 views
0

我有主视图和局部视图:ASP.NET MVC 4 IEnumerable的<MyModel>客户端验证

// // 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客户端验证无法与问题答案模型的许多对象句柄,它是取第一个文本框从for循环,并用它来验证所有的局部视图。 是否可以在客户端正确验证来自一个模型的许多对象?

回答

1

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

我建议你通过following article,其中史蒂文桑德森说明了一个漂亮的小帮手,叫做Html.BeginCollectionItem,它使用Guids作为收集项目的索引。这将允许客户端验证正常工作。