如何对文本框列表使用所需的数据批注
本文关键字:数据 文本 列表 | 更新日期: 2024-10-30 07:34:46
我有一个表单,其中包含自定义问题的多个值。作为用户的想法可以使用自定义答案制作自己的自定义问题。模型对象的属性之一是对象列表:
public class CustomQuestion
{
public int Id { get; set; }
[Required]
public string QuestionName{ get; set; }
public virtual List<CustomQuestionAnswer> Answers { get; set; }
}
public class CustomQuestionAnswer
{
public int Id { get; set; }
[Required]
public string Answer { get; set; }
}
现在我在剃须刀中有了这个,它可以创建答案(我省略了问题的其余部分):
foreach (var answer in Model.Answers)
{
if (answer.IsActive)
{
<div class="form-group answer">
<div class="col-md-10">
@Html.Hidden("answerswers[" + count + "].Id", answer.Id)
@Html.TextBox("answerswers[" + count + "].Answer", answer.Answer, new { @class = "form-control" })
validation code will go here
</div>
<div class="col-md-2">
@Html.CheckBox("answerswers[" + count + "].IsActive", answer.IsActive)
</div>
</div>
count++;
}
}
现在一切正常并保存到数据库中,除了数据验证不起作用。我有数据验证消息适用于自定义问题的问题名称(所以我知道这不是 jquery 正确加载的问题),但不适用于答案。我尝试将这些行放在剃须刀形式中:
@Html.ValidationMessageFor(m => answer.Answer, "", new { @class = "text-danger" })
@Html.ValidationMessage("Answers[" + count + "].Answer", "", new { @class = "text-danger" })
但两者都不起作用。另外,当我单击保存按钮时,我在浏览器控制台中收到此错误消息:
Failed to load resource: the server responded with a status of 400 ({"Answers[0].Answer":["The Answer field is required."]})
关于验证代码需要什么的任何想法?
如果您的模型是(或包含)索引集合,最好使用 for
循环以及完全指定的变量和...For
帮助程序,如下所示:
for (var i = 0; i < Model.Answers.Count; i++)
{
if (Model.Answers[i].IsActive)
{
<div class="form-group answer">
<div class="col-md-10">
@Html.HiddenFor(m => Model.Answers[i].Id)
@Html.TextBoxFor(m => Model.Answers[i].Answer, new { @class = "form-control" })
@Html.ValidationMessageFor(m => Model.Answers[i].Answer, null, new { @class = "text-danger" })
</div>
<div class="col-md-2">
@Html.CheckBoxFor(m => Model.Answers[i].IsActive)
</div>
</div>
}
}
在任何地方继续引用完整的Model.Answers[i]
似乎很尴尬甚至没有必要,但 MVC 使用这些表达式的反射来提出要输出的全名,这是模型绑定成功所必需的,也是将其与使用相同对象结构的 ModelState 配对所必需的。
使用临时变量或辅助变量(如 answer
)将导致 MVC 无法再执行此操作,然后负担就变成了你自己的负担。
如果您有 ViewModel,则应使用强类型帮助程序。要进行正确的狂欢,您应该使用循环for
而不是foreach
。
喜欢这个:
for (int i = 0; i < Model.Answers.Count(); i++)
{
if (Model.Answers[i].IsActive)
{
<div class="form-group answer">
<div class="col-md-10">
@Html.HiddenFor(x => Model.Answers[i].Id)
@Html.TextBoxFor(x => Model.Answers[i].Answer, new { @class = "form-control" })
@Html.ValidationMessageFor(m => x => Model.Answers[i].Answer, null, new { @class = "text-danger" })
</div>
<div class="col-md-2">
@Html.CheckBox(x => Model.Answers[i].IsActive)
</div>
</div>
}
}
您可以在模型中自定义消息喜欢:
[Required]
[DataType(DataType.EmailAddress, ErrorMessage = "You need a valid email adress")]
[MaxLength(40, ErrorMessage = "the length of an Email address must be at least 40 chars")]
[Display(Name = "Email")]
public string CurrentMail { get; set; }
然后你做一个简单的
@Html.TextBoxFor(m => m.CurrentMail)
而不是@Html.TextBox(m => m.CurrentMail)
对于验证,您可以使用以下代码:
@Html.ValidationMessageFor(m => answer.Answer,null, new { @class = "text-danger" })
请检查一下,让我知道..