C# 验证仅应用于数组的第一项

C# 验证仅应用于数组的第一项,c#,asp.net,asp.net-mvc,validation,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Validation,Asp.net Mvc 4,给定此模型代码 [必需] [显示(Name=“Name”)] 公共字符串名称{get;set;} 以下视图代码有效 @Html.LabelFor(model=>model.Name) @Html.TextBoxFor(model=>model.Name) @Html.ValidationMessageFor(model=>model.Name) 每当我将名称字段留空时,文本框将以红色突出显示,并显示一条“名称字段是必需的。”错误消息,这很好 但是,我的模型还包含一个选项[]Options,

给定此模型代码

[必需]
[显示(Name=“Name”)]
公共字符串名称{get;set;}
以下视图代码有效

@Html.LabelFor(model=>model.Name)
@Html.TextBoxFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
每当我将
名称
字段留空时,
文本框
将以红色突出显示,并显示一条
“名称字段是必需的。”
错误消息,这很好


但是,我的模型还包含一个
选项[]Options
,该选项也需要验证

给定此模型代码

private const string orderNoDisplayName=“订单号”;
[必需]
[正则表达式(@“\d+”,
ErrorMessage=““+OrderNodeDisplayName+”字段必须是数字。”)]
[显示(名称=OrderNodeDisplayName)]
公共字符串OrderNo{get;set;}
下面的视图代码并不像预期的那样工作

@foreach(option.GetDefaultOptions()中的var选项)
{
  • @TextBoxFor(model=>option.OrderNo,new{id=option.IdString}) @Html.ValidationMessageFor(model=>option.OrderNo, null,新{data_valmsg_for=option.IdString})
  • }
    第一个
    选项
    工作正常,但任何后续的
    选项
    都不能

    下面是为2
    选项
    s自动生成的代码

    很明显,MVC根本没有向我的第二个
    选项或任何后续的
    选项添加任何验证属性


    当然,我可以将验证硬编码到手写的
    标记中,但我希望避免这样做。我该怎么做才能使所有
    选项的验证工作,而不仅仅是第一个?

    我认为问题在于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"
    

    我认为问题在于for循环,因为modelbinder没有索引name字段,它们的结果是相同的,看起来只有一个,即
    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"
    

    自动生成的输入看起来像什么?从代码看,您的所有输入都是相同的。这就是为什么只有第一个是正确的validated@MattBodily自动生成的代码已经包含在内(这是最后一个代码块),我只是添加了注释以使其更易于阅读。自动生成的输入看起来像什么?从代码看,您的所有输入都是相同的。这就是为什么只有第一个是正确的validated@MattBodily自动生成的代码已经包含在内了(这是最后一个代码块),我只是添加了注释以使其更易于阅读。太棒了,它真的很有效。我不知道索引器是如此重要。@Nolonar非常好,我知道它也吸引了我。一旦你知道,你永远不会忘记。:)太棒了,真的很管用。我不知道索引器是如此重要。@Nolonar非常好,我知道它也吸引了我。一旦你知道,你永远不会忘记。:)