使用内置验证来验证动态创建的View

时间:2013-03-18 08:58:58

标签: asp.net-mvc-4 entity-framework-5 data-annotations

我想创建一个内容数据能够动态扩展的任务系统(使用不同类型的输入(文本,图像,下拉菜单等)。我的计划是创建以下模型,并在某些人的帮助下自定义HtmlHelpers生成我的视图。

型号:

public class Task
{
    public int TaskId { get; set; }
    public string Name { get; set; }
    public virtual List<TaskData> TaskData { get; set; }
}

public enum TaskDataType
{
    TextType1, TextType2, E-mail, Image
}

public class TaskData
{
    public int TaskDataId { get; set; }
    public int TaskId { get; set; }
    public TaskDataType Type { get; set; }
    public string Name { get; set; }
    [Required]
    public string Data { get; set; }
    public bool Required { get; set; }
    public virtual Task Task { get; set; }
}

查看:

验证任务,使用默认的HtmlHelpers开箱即用,但当我尝试制作类似的东西时:

    @if (Model.TaskData != null)
    {
        foreach (var taskData in Model.TaskData)
        {
            @Html.DisplayTextFor(td => taskData.Name)
            @Html.TextBoxFor(td => taskData.Data)
            @Html.ValidationMessageFor(td => taskData.Data)
        }
    }

在我的视图中,验证开始出错,客户端站点验证仅验证forech循环中的第一个输入,并且控制器中的ModelState不包含任何有关TaskData字段的数据。

所以我有两个问题:

  1. 这是正确的道路吗,还是我需要以不同的方式考虑这个问题?

  2. 如果这是制作我想要的有效方法,有没有办法让构建验证工作?

1 个答案:

答案 0 :(得分:0)

您必须使用for循环才能发布字段值以及让构建验证为您工作。

@if (Model.TaskData != null)
    {
        for(int i=0; i< Model.TaskData.Count; i++)
        {
            @Html.DisplayTextFor(model => model.TaskData[i].Name)
            @Html.TextBoxFor(model => model.TaskData[i].Data)
            @Html.ValidationMessageFor(model => model.TaskData[i].Data)
        }
    }