如何对文本框列表使用所需的数据批注

本文关键字:数据 文本 列表 | 更新日期: 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" })

请检查一下,让我知道..