【问题标题】:Validation is only applied to the first item of an array验证仅适用于数组的第一项
【发布时间】:2014-02-03 14:26:57
【问题描述】:

鉴于此型号代码

[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个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 没有向我的第二个 option 或任何后续的 options 添加任何验证属性。

当然,我可以将验证硬编码到手写的&lt;input&gt; 标签中,但我想避免这样做。我该怎么做才能使所有options 的验证工作,而不仅仅是第一个?

【问题讨论】:

  • 自动生成的输入是什么样的?从代码看来,您的所有输入都是相同的。这就是为什么只有第一个被验证的原因
  • @MattBodily 自动生成的代码已经包含(这是最后一个代码块),我只是添加了 cmets 以便于阅读。

标签: c# asp.net asp.net-mvc validation asp.net-mvc-4


【解决方案1】:

我认为问题出在 for 循环上,因为模型绑定器没有索引名称字段,它们的输出相同,而且看起来只有一个,即 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"

【讨论】:

  • 太棒了,它确实有效。不知道索引器如此重要。
  • @Nolonar 太好了,我知道它也让我着迷。一旦你知道,你永远不会忘记。 :)
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
相关资源
最近更新 更多