验证仅适用于数组的第一项 [英] Validation is only applied to the first item of an array
问题描述
由于这种模式code
Given this model code
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
下面的视图code ++工程
the following view code works
@Html.LabelFor(model => model.Name)
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
每当我离开名称
字段为空,则文本框
高亮显示为红色,而要求的名称字段。
出现错误信息,这是很好的。
Whenever I leave the Name
field empty, the TextBox
is highlighted in red, and a "The Name field is required."
error message appears, which is good.
不过,我的模型还包含一个选项[]选项
这也需要进行验证。
However, my model also contains an Option[] Options
which also need to be validated.
由于这种模式code
Given this model code
private const string orderNoDisplayName = "Order number";
[Required]
[RegularExpression(@"\d+",
ErrorMessage = "The " + orderNoDisplayName + " field must be numeric.")]
[Display(Name = orderNoDisplayName )]
public string OrderNo { get; set; }
下面的视图code没有如预期相当的工作。
the following view code doesn't quite work as expected
@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>
}
在第一个选项
作品完美,但任何后续的选项
没有。
The very first option
works perfectly, but any subsequent option
doesn't.
下面是自动生成的code 2 选项
取值
Below is the automatically generated code for 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的没有添加任何属性验证我的第二个选项
或任何后续的选项
■在所有。
So obviously, MVC did not add any validation attributes to my second option
or any subsequent option
s at all.
当然,我也很难code中的验证成手写&LT;输入&GT;
标记,但我想避免这样做。我能做些什么,使所有的选项
S上的验证工作,而不是只有第一个?
Of course, I could hardcode the validations into a handwritten <input>
tag, but I'd like to avoid doing so. What can I do to make the validation work for all option
s, instead of only the first one?
推荐答案
我认为这个问题是for循环,因为该模型粘合剂不是索引的名称字段他们走出相同的,它看起来像只有一条即 NAME =OrderNo
。
I think the problem is the for loop, as the model binder is not indexing the name field they're coming out identical and it looks like there is only one i.e. name="OrderNo"
.
试着改变你的循环指数,如下所示:
Try changing your loop to index it as follows:
@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>
}
然后,您应该看到如下他们正在写出来:
You should then see that they're written out as follows:
name="[0].OrderNo"
name="[1].OrderNo"
这篇关于验证仅适用于数组的第一项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!