使用Dataannotations验证集合

时间:2011-07-21 09:54:59

标签: c# asp.net-mvc data-annotations

刚开始使用ASP.NET MVC,我在将数据注释应用于集合时遇到了一些麻烦 - 我要么缺少一些基本的东西,要么以错误的方式处理整个事情。

我将此ViewModel传递给强类型视图:

public class AddCostingViewModel
{
      [Required]
      [Range(120,190)]
      public int SomeValue {get; set;}

      public List<Grade> Grades { get; set; }
      public List<int> GradeValues { get; set; }
}

我不知道任何一个成绩列表中的对象数量是否会在将来保持不变,所以我无法传入“Grade1,Grade2”等 - 传递这样的列表并构建我的cshtml页面似乎比如最明显的方法来确保我总是有一个包含所有可能等级的表单,并返回正确的值。我的cshtml看起来像这样

<tr>
    @foreach (var g in Model.Grades)
    {
        <th>@g.GradeName</th>
    }
    </tr>
    <tr>

    @for (int i = 0; i < Model.Grades.Count(); i++)
    {
        <td>
        <div class="editor-field">
            @Html.EditorFor(model => model.GradeValues[i])
            @Html.ValidationMessageFor(model => model.GradeValues[i])
        </div>
        </td>
    }
    </tr>

可轻松生成包含用于编辑所有可能成绩值的字段的表格。但是,我想针对范围验证这些(与上面的SomeValue一样),但是在列表上方添加数据注释(就像我使用SomeValue一样)似乎不起作用。这是可能的还是我的方法完全错了?

1 个答案:

答案 0 :(得分:2)

看起来,您的成绩值不是简单的int,它是具有某些特定于域的限制的int。遵循这个逻辑,我会设计新的等级值来保持等级值

public class GradeValue
    {
        [Range(100, 200)]
        public int Value { get; set; }
    }

在您的模型中,描述成绩值列表的属性将是

public List<GradeValue> GradeValues { get; set; }

验证会将rande应用于viewModel中的每个GradeValue。在视图中,您不必更改任何单行代码。此外,您可以将GradeValue class设计为implicitely可转换为int,反之亦然,以便更简单地使用。