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非常好,我知道它也吸引了我。一旦你知道,你永远不会忘记。:)