我有一对非常简单的课程:
public class Question
{
[Key]
public int QuestionId { get; set; }
[Required]
[Display(Name ="Question Text")]
public string QuestionText { get; set; }
public virtual IList<Answer> Answers { get; set; }
}
public class Answer : IValidatableObject
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid AnswerId { get; set; }
[Required]
[Display(Name = "Answer Text")]
public string AnswerText { get; set; }
[Required]
[Display(Name = "Is Correct")]
public bool IsCorrect { get; set; }
}
我正在尝试使用MVC编辑页面来编辑问题和答案。所以我有这样的事情:
@using (Html.BeginForm())
{
<input type="submit" value="Save Question" class="btn btn-default" />
@Html.HiddenFor(model => model.QuestionId)
@Html.EditorFor(model => model.QuestionText, new { htmlAttributes = new { @class = "form-control" } })
<h4>Answers:</h4>
@Html.EditorFor(model => model.Answers)
}
Answer
这样的模板:
@Html.HiddenFor(model => model.AnswerId)
@Html.EditorFor(model => model.AnswerText, new { htmlAttributes = new { @class = "form-control" } })
@Html.EditorFor(model => model.IsCorrect)
加载页面一切看起来都不错。我可以看到它对问题和答案都有所约束。但在提交时,Question
对象已填充,但Answers
为空。但看起来提交确实包含了我期望的所有领域:
QuestionId:36
QuestionText:This is a test
Answers[0].AnswerId:0b5a2bdd-32fd-e711-93fc-b8ca3a683254
Answers[0].AnswerText:TRUE
Answers[0].IsCorrect:true
Answers[0].IsCorrect:false
Answers[1].AnswerId:0c5a2bdd-32fd-e711-93fc-b8ca3a683254
Answers[1].AnswerText:FALSE
Answers[1].IsCorrect:false
那么这里发生了什么?从我所读过的内容(很多以前版本的MVC)来看,这应该可行。是因为使用GUID作为id吗?我错过了什么使这个绑定正确?
最终,我希望能够添加和删除Answers
,但这里一步一步。
Answers[0].IsCorrect
两次。这是生成的HTML:
<input checked="checked" class="check-box" data-val="true" data-val-required="The Is Correct field is required." id="Answers_0__IsCorrect" name="Answers[0].IsCorrect" type="checkbox" value="true">
<input name="Answers[0].IsCorrect" type="hidden" value="false">
对于其生成的其他答案(Answer[1]
),只会为Answers[1].IsCorrect
生成一个值:
<input class="check-box" data-val="true" data-val-required="The Is Correct field is required." id="Answers_1__IsCorrect" name="Answers[1].IsCorrect" type="checkbox" value="true">
<input name="Answers[1].IsCorrect" type="hidden" value="false">