我有模型,具有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 - false。
修改 我试图利用不显眼的验证。对主题的验证是有效的(用户不能发布包含无效主题的表单)
for循环将被jquery添加/删除收件人取代。
答案 0 :(得分:3)
您无法在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
课程创建editor template,如下所示:
@Html.TextBoxFor(model => model.EmailAddress)
现在,在绑定到SendEmailModel
的主视图中,您可以执行此操作:
@Html.EditorForModel
这将为每个属性创建一个编辑器。在这种情况下,属性的类型为IEnumerable<Recipient>
,因此它将为该列表中的每个项目创建一个编辑器模板(如前所述)。所有验证都将自动应用。
Here也是类似的讨论。
答案 1 :(得分:1)
只是一个想法但是如何创建旁路属性?
可能会做类似
的事情string RecipienctsCsv {
get
{
return string.Join(', ', Recipiencts);
}
}
然后,您再也没有显示足够的代码来验证是否适合您。另一种选择是扩展HtmlHelper以使其适用于IEnumerable