对我的ViewModel列表中的每个项目进行数据验证

Pie*_*aud 4 c# validation custom-attributes asp.net-mvc-viewmodel

要使用正则表达式进行验证,我通常会这样做:

// In my ViewModel
[RegularExpression("MyRegex", ErrorMessageResourceName = "MyErrorMessage")]
public string MyField { get; set; }
Run Code Online (Sandbox Code Playgroud)

和HTML助手

@Html.TextBoxFor(model => model.MyField)
Run Code Online (Sandbox Code Playgroud)

生成一个如下所示的标记:

<input type="text" class="valid" name="MyField" value="" id="MyField" data-val="true" data-val-regex-pattern="MyRegex" data-val-regex="MyErrorMessage"></input>
Run Code Online (Sandbox Code Playgroud)

问题是我希望有一个动态数量的字段,现在正在使用

// In my ViewModel
[RegularExpression("MyRegex", ErrorMessageResourceName = "MyErrorMessage")]
public IList<string> MyField { get; set; }
Run Code Online (Sandbox Code Playgroud)

这次

@Html.TextBoxFor(model => model.MyField[0])
Run Code Online (Sandbox Code Playgroud)

将生成(没有正则表达式html属性)

<input id="MyField_0_" type="text" value="" name="MyField[0]"></input>
Run Code Online (Sandbox Code Playgroud)

如何data-val在我的ViewModel中绑定具有DataAnnotation验证属性的列表的元素时,如何确保创建html属性?

Cla*_*ies 8

数据批注实际上没有办法应用于列表的元素.您需要做的是创建一个包装类并将Data Annotation应用于包装类中的元素,如下所示:

public IList<MyField> MyFields {get;set;}

public class MyField
{
    [RegularExpression("MyRegex", ErrorMessageResourceName = "MyErrorMessage")]
    public string Value
}
Run Code Online (Sandbox Code Playgroud)

用法:

@Html.TextBoxFor(model => model.MyFields[0].Value)
Run Code Online (Sandbox Code Playgroud)