2014-02-03 5 views
2

Учитывая этот код моделивалидация применяется только к первому элементу массива

[Required] 
[Display(Name = "Name")] 
public string Name { get; set; } 

следующий вид код работает

@Html.LabelFor(model => model.Name) 
@Html.TextBoxFor(model => model.Name) 
@Html.ValidationMessageFor(model => model.Name) 

Всякий раз, когда я оставляю Name поле пустым, TextBox подсвечивается красный, и появляется сообщение об ошибке "The Name field is required.", что хорошо.


Однако моя модель также содержит Option[] Options, которые также должны быть проверены.

Учитывая этот код модели

private const string orderNoDisplayName = "Order number"; 
[Required] 
[RegularExpression(@"\d+", 
       ErrorMessage = "The " + orderNoDisplayName + " field must be numeric.")] 
[Display(Name = orderNoDisplayName)] 
public string OrderNo { get; set; } 

следующий вид кода не совсем работа, как ожидается,

@foreach (var option in Option.GetDefaultOptions()) 
{ 
    <li> 
     @Html.TextBoxFor(model => option.OrderNo, new { id = option.IdString }) 
     @Html.ValidationMessageFor(model => option.OrderNo, 
             null, new { data_valmsg_for = option.IdString }) 
    </li> 
} 

Самые первые option работает отлично, но любой последующий option нет.

Ниже автоматически генерируется код 2 option s

<ul> 

    <li> <!-- automatically generated code for 'option_1' --> 
     <input data-val="true" data-val-regex="The Order number field must be numeric." 
data-val-regex-pattern="\d+" data-val-required="The Order number field is required." 
id="option_1" name="OrderNo" type="text" value="0" class="input-validation-error"> 

     <span class="field-validation-valid" data-valmsg-for="option_1" 
data-valmsg-replace="true"></span> 
    </li> 

    <li> <!-- automatically generated code for 'option_2' --> 
     <input id="option_2" name="OrderNo" type="text" value="0" 
class="input-validation-error"> 

     <span class="field-validation-valid" data-valmsg-for="option_2" 
data-valmsg-replace="true"></span> 
    </li> 

</ul> 

Так, очевидно, MVC не добавить любые проверки атрибутов моей второй option или последующих option с на всех.

Конечно, я мог бы жестко скопировать проверки в рукописный текст <input>, но я бы хотел, чтобы этого не делалось. Что я могу сделать, чтобы сделать валидацию для всех option s, а не только первой?

+0

что же автогенерируемая входы выглядеть? Похоже, что из кода все ваши входы идентичны. Это было бы причиной того, что только первый валидирован. –

+0

@MattBodily. Автоматически сгенерированный код уже включен (это последний блок кода), я просто добавил комментарии, чтобы было легче читать. – Nolonar

ответ

4

Я думаю, что проблема в цикле for, поскольку модельное связующее не индексирует поле имени, оно выходит одинаково, и похоже, что существует только один i.e. name="OrderNo".

Попробуйте изменить цикл индексировать его следующим образом:

@for (var i = 0; i < Option.GetDefaultOptions().Count; i++) 
{ 
    <li> 
     @Html.TextBoxFor(model => Option.GetDefaultOptions()[i].OrderNo, new { id = Option.GetDefaultOptions()[i].IdString }) 
     @Html.ValidationMessageFor(model => Option.GetDefaultOptions()[i].OrderNo, 
             null, new { data_valmsg_for = Option.GetDefaultOptions()[i].OrderNo.IdString }) 
    </li> 
} 

Вы должны увидеть, что они написаны следующим образом:

name="[0].OrderNo" 
name="[1].OrderNo" 
+1

Удивительно, это действительно работает. Не знал, что индекс настолько значителен. – Nolonar

+2

@Nolonar Отлично, я знаю, что это меня тоже. Как только вы знаете, вы никогда не забудете. :) – hutchonoid

Смежные вопросы