验证仅适用于数组的第一项 [英] Validation is only applied to the first item of an array

查看:113
本文介绍了验证仅适用于数组的第一项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于这种模式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 options

<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 options 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 options, 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆