ASP.Net MVC 2 RC:如何使用客户端验证和列表的数据注释?

时间:2010-01-26 20:29:49

标签: asp.net-ajax asp.net-mvc-2 data-annotations asp.net-mvc-2-validation

我的问题:

我无法让数据注释客户端验证在我的viewdata类中使用List。

瘦子

在我的视图数据类中,我有一个List。

public class FriendsViewData
{
    public List<Person> people { get; set; }
}

我使用Data Annotations按需要拥有Person类的所有属性。

public class Person
{
    [Required(ErrorMessage="First Name is required")]
    public string FirstName { get; set; }
}

在View I中循环列表如下: ...

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

<% Html.EnableClientValidation(); %>

<% using (Html.BeginForm()) {%>

<%
   for(int i=0; i < Model.people.Count; i++)
   {%>
       <div>
         <%= Html.TextBox(string.Format("people[{0}].FirstName",i), Model.people[i].FirstName)%>
         <%= Html.ValidationMessage(string.Format("people[{0}].FirstName", i))%>
       </div>
<% } %>

<input type="submit" value="Submit" />

<% } %>

生成的HTML

<div>
    <input id="people_0__FirstName" name="people[0].FirstName" type="text" value="Name0" />
    <span class="field-validation-valid" id="form0_people_0__FirstName_validationMessage"></span>     
</div>

<div>
    <input id="people_1__FirstName" name="people[1].FirstName" type="text" value="Name1" />
    <span class="field-validation-valid" id="form0_people_1__FirstName_validationMessage"></span>     
</div>

<div>
    <input id="people_2__FirstName" name="people[2].FirstName" type="text" value="Name2" />
    <span class="field-validation-valid" id="form0_people_2__FirstName_validationMessage"></span>     
</div>

结果

根本没用。

我尝试过的其他事情:

尝试在视图中使用这些HTML Helper方法:

    <div>
        <%= Html.TextBoxFor(model => model.people[i].FirstName) %>
        <%= Html.ValidationMessageFor(model => model.people[i].FirstName) %>
    </div>

生成输出:

       <div>  
           <input id="FirstName" name="FirstName" type="text" value="Name0" />  
           <span class="field-validation-valid" id="form0_FirstName_validationMessage"></span>  
       </div>  

       <div>  
           <input id="FirstName" name="FirstName" type="text" value="Name1" />  
           <span class="field-validation-valid" id="form0_FirstName_validationMessage"></span>  
       </div>  

       <div>  
           <input id="FirstName" name="FirstName" type="text" value="Name2" />  
           <span class="field-validation-valid" id="form0_FirstName_validationMessage"></span>  
       </div> 

结果

有趣的是,当我在第一个文本框上触发验证时,它会同时触发所有文本框。其余的文本框根本不会触发验证。

注意文本框及其相应的错误文本span元素的所有生成的id和名称都是相同的。

有没有人知道如何在视图数据中使用客户端验证与列表支持ModelBinding

谢谢!

1 个答案:

答案 0 :(得分:2)

来自ASP.Net团队的Brad Wilson在ASP.Net论坛上回答了我同样的问题。

  <div>  
       <%= Html.TextBoxFor(model => model.people[i].FirstName) %>  
       <%= Html.ValidationMessageFor(model => model.people[i].FirstName) %>  
  </div>  

这是正确的方法,但它现在已经被打破了,并将在下一滴中修复。

http://forums.asp.net/t/1518900.aspx