ASP.Net MVC 2 RC: как использовать проверку клиента с аннотациями данных для списков?

Моя проблема:

Я не могу заставить клиентскую проверку аннотаций данных работать со списком в моем классе viewdata.

Худые:

В моем представлении класса данных у меня есть список.

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

У меня есть все необходимые свойства класса Person с использованием аннотаций к данным.

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

В представлении я зацикливаю список следующим образом: ...

<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 в представлении:

    <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> 

Результат:

Интересно, что когда я запускаю проверку для первого текстового поля, она запускается одновременно для всех текстовых полей. Остальные текстовые поля вообще не запускают проверку.

Обратите внимание, что все сгенерированные идентификаторы и имена для текстовых полей и соответствующего им элемента диапазона текста ошибки идентичны.

Кто-нибудь знает, как использовать проверку клиента со списком в данных представления, с поддержкой ModelBinding?

Спасибо!


person Ozzie Perez    schedule 26.01.2010    source источник


Ответы (1)


Брэд Уилсон из команды ASP.Net ответил на мой вопрос на форумах 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

person Ozzie Perez    schedule 27.01.2010
comment
Сегодня был выпущен ASP.Net MVC RC 2, и эта ошибка была исправлена. - person Ozzie Perez; 05.02.2010