如何验证IEnumerable属性在MVC 4中的模型

本文关键字:MVC 属性 模型 string 何验证 验证 IEnumerable | 更新日期: 2023-09-27 18:02:10

我有一个模型,它有IEnumerable属性。

public class SendEmailModel
{
    [Required]
    [RegularExpression(Helper.DefaultEmailValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))]
    public IEnumerable<string> Recipients { get; set; }
    [RegularExpression(Helper.DefaultInputValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))]
    public string Subject { get; set; }
    ...
}

@using (Ajax.BeginForm("SendEmail", "Admin", new AjaxOptions { LoadingElementId = "loadingPane" }, new { id = "SendEmailForm"}))
{
    <div class="custom-validation-summary-errors"></div>
    <div>
        @Html.LabelFor(m => m.Recipients, i18n.To):
    </div>
    for (int i = 0; i < 10; i++)
    {
        <div>
            @Html.EditorFor(m => m.Recipients, "String")
        </div>
    }
    <div class="mt20">
        @Html.LabelFor(m => m.Subject, i18n.Subject):
    </div>
    <div>
        @Html.EditorFor(m => m.Subject, "String")
    </div>
   ...
   <input type="submit" value="Send"/>
}

但是当发布表单验证不工作。张贴后,我得到ModelState。

编辑:

我正在尝试使用不引人注目的验证。主题验证正在工作(用户不能发布带有无效主题的表单)

for循环将被jquery添加/删除收件人所取代。

如何验证IEnumerable<string>属性在MVC 4中的模型

不能在IEnumerable<T>类型属性上使用验证数据注释。您可以创建包装器类,如下所示:

public class Recipient
{
    [RegularExpression(Helper.DefaultEmailValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))]
    public string EmailAddress { get; set; }
}

然后在主ViewModel中,

public class SendEmailModel
{
    [Required]
    public IEnumerable<Recipient> Recipients { get; set; }
    ...
}

现在您可以通过创建绑定到Recipient的部分视图来为Recipient类创建编辑器模板,如下所示:

@Html.TextBoxFor(model => model.EmailAddress)

现在,在绑定到SendEmailModel的主视图中,您可以这样做:

@Html.EditorForModel

将为每个属性创建一个编辑器。在本例中,属性的类型是IEnumerable<Recipient>,因此它将为该列表中的每个项目创建一个编辑器模板(如前面定义的那样)。所有验证将自动应用。

只是一个想法,但如何创建一个绕过属性?

可以像

一样
string RecipienctsCsv {
 get
 {
   return string.Join(', ', Recipiencts);
 }
}

然后你又没有显示足够的代码来验证这是否适合你。另一个选择是扩展HtmlHelper,使其适用于IEnumerable