我有一个IEnumerable包含字符串,使用Data Annotations进行验证:
[Required(ErrorMessage = "This is required.")]
[Remote("IsValid", "ControllerName")]
public IEnumerable<string> MyList { get; set; }
然后我使用编辑器模板。这就是我在观点中称之为的方式:
@Html.EditorFor(m => m.MyList)
最后,我的模板采用了这个IEnumarable并为每个元素创建了许多表单元素:
@model IEnumerable<string>
@foreach (var str in Model)
{
<li>
@Html.LabelFor(m => str, "My Label")
@Html.TextBoxFor(m => str)
@Html.ValidationMessageFor(m => str)
</li>
}
即使表单元素确实正确呈现,我是否正确接近?此外,我注意到它不再验证。我该如何解决这个问题?
答案 0 :(得分:7)
你是以“正确”的方式进行的。 (正确的说它可以工作,我之前已经完成了这个)但是通过验证我认为它不起作用的原因是,你有IEnemerable的验证而不是字符串。 要对每个字符串进行验证。你必须创建一个新的模型对象说
public class LabelString
{
[Required(ErrorMessage = "This is required.")]
public string labelName { get; set; }
}
然后您将public IEnumerable<string> MyList { get; set; }
替换为public IEnumerable<LabelString> MyList { get; set; }
这应该让你对for循环中的每个标签进行验证。
答案 1 :(得分:3)
它不是一个数学,所以你的问题解决方案不止一个,没有正确的。
然而,说,我宁愿采用不同的方法:
public class StringsViewModel
{
IEnumerable<string> myList;
}
在视图中你需要
@model StringsViewModel
@EditorForModel()
它将验证,因为您现在拥有强类型模型而不是通用模型。
此外,您还可以保存框架自动为您完成的foreach
循环...
希望这有帮助。