繁体   English   中英

如何验证IEnumerable <string> MVC 4中Model中的属性

[英]How to validate IEnumerable<string> property in Model in MVC 4

我有模型,具有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.IsValid-假。

编辑:我正在尝试使用不干扰用户的验证。 主题验证有效(用户无法发布带有无效主题的表格)

for循环将被jquery添加/删除收件人替换。

您不能在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM