涉及数组时不引人注意的错误

时间:2013-02-25 23:39:04

标签: asp.net asp.net-mvc razor asp.net-mvc-4 unobtrusive-validation

我有以下电话:

    @Html.TextBoxFor(m => m.SelectedName)
    @Html.TextBoxFor(m => m.Selections[0].Name)

在这两种情况下,我分别使用以下注释标记SelectedNameName

    [Required(ErrorMessage = "Please provide required value")]

然而,SelectedName打印正确的不显眼的html属性:

<input id="SelectedName" name="SelectedName" data-val="true" data-val-required="Please provide required value">

m.Selections [0] .Name显示如下:

<input id="Selections_0__Name" name="Selections[0].Name" value="" type="text">

是什么给出的?我无法相信这种情况在MVC4中被忽略了,它似乎是一个相当常见的用例。我如何验证作为数组或包含数组的视图模型?

===================== EDIT为了清晰起见为ViewModels添加代码================== ===

public class ContainerVM
{
    [Required]
    public string SelectedName {get;set;}
    public MemberVM[] Selections {get;set;}
}

public class MemberVM
{
    [Required]
    public string Name { get;set; }
}

=====================表格====================

@using MyProject.Models;
@model ContainerVM
@{
    ViewContext.FormContext = new FormContext(); //This is just a hack because the parent isn't defined yet.
}

        @Html.TextBoxFor(m => m.SelectedCptGroupId)
        @Html.TextBoxFor(m => m.CptGroupSelections[0].Name)

1 个答案:

答案 0 :(得分:2)

我在获得更多反馈之前犹豫不决,但是

[required]注释不能应用于数组或复杂对象。

您可以为类的特定元素甚至嵌套类的成员应用[required]注释。

显然我们都知道我们可以注释经典

[required]
public string SelectedName {get; set;}

这应该有效。我不能谈论这个问题。

但是,相反地对字符串数组进行注释

[required]
public string[] SelectedName {get;set;}

会失败。为了成功,你必须注释模型的每个元素。

同样如果我们尝试使用成员注释嵌套模型     [需要]     public SelectionsModel Selections {get; set;}

这也会失败。

最糟糕的是,看起来你正试图注释一系列模型     [需要]     public SelectionsModel Selections [] {get; set;}

,这又会失败。


应该做些什么(虽然我没有尝试过):

注释嵌套模型选择的每个元素。

然后,数组的每个模型的每个元素都需要输入。

    public class SelectionsModel 
    {
        [required]
        public string name {get; set;}
        [required]
        public int age { get; set; }

    }