在MVC 3中使用EditorFor和IEnumerable <string> </string>

时间:2012-08-27 02:04:37

标签: asp.net-mvc razor

我有一个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>
}

即使表单元素确实正确呈现,我是否正确接近?此外,我注意到它不再验证。我该如何解决这个问题?

2 个答案:

答案 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循环...

希望这有帮助。