我有主要观点和部分观点:
// // 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并用它来验证所有局部视图。
是否可以在客户端正确验证来自一个模型的许多对象?
答案 0 :(得分:1)
此处的问题是AnswerText
文本框的名称。它们都具有相同的名称,不显眼的客户端验证框架不会如何附加项目。所以它只是附加到第一个。
我建议你浏览following article
,其中Steven Sanderson演示了一个名为Html.BeginCollectionItem
的好帮手,它使用Guids作为收集物品的索引。这将允许客户端验证正常工作。