Asp.net mvc asp.net mvc5正在验证对象列表

Asp.net mvc asp.net mvc5正在验证对象列表,asp.net-mvc,validation,asp.net-mvc-5,unobtrusive-validation,Asp.net Mvc,Validation,Asp.net Mvc 5,Unobtrusive Validation,我可以在列表中的每个项目上输入交付数量,并将对象列表发送回控制器。我想验证页面上的所有文本框,并且在模型中添加了注释 问题是,我只能验证第一行(同样在输出html中,只有第一行有验证标记)。因为在第一行有生成的验证,所以我认为这与模型无关。是否有办法在所有行中生成验证?如果没有,解决办法是什么 @{int i = 0;} @foreach (var item in Model) { <tr> <td>

我可以在列表中的每个项目上输入交付数量,并将对象列表发送回控制器。我想验证页面上的所有文本框,并且在模型中添加了注释

问题是,我只能验证第一行(同样在输出html中,只有第一行有验证标记)。因为在第一行有生成的验证,所以我认为这与模型无关。是否有办法在所有行中生成验证?如果没有,解决办法是什么

    @{int i = 0;}
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.HiddenFor(modelItem => item.eo, new { Name = "[" + i + "].eo" })
                @Html.DisplayFor(modelItem => item.barcode)
                @Html.Hidden("[" + i + "].barcode", Model[i].barcode)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.itemno)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.cdesc)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.acost)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.qty)
            </td>
            <td>
                @Html.EditorFor(modelItem => item.dqty, new { htmlAttributes = new { Name = "[" + i + "].dqty", id = "[" + i + "].dqty", @class = "form-control" } })
                @Html.ValidationMessage("[" + i + "].dqty", "", new { @class = "text-danger" })
            </td>
        </tr>
        i++;
    }
@{int i=0;}
@foreach(模型中的var项目)
{
@Html.HiddenFor(modeleItem=>item.eo,新的{Name=“[“+i+”].eo”})
@DisplayFor(modelItem=>item.barcode)
@Html.Hidden(“[”+i+“].barcode”,型号[i].barcode)
@DisplayFor(modelItem=>item.itemno)
@DisplayFor(modeleItem=>item.cdesc)
@DisplayFor(modeleItem=>item.acost)
@DisplayFor(modelItem=>item.qty)
@Html.EditorFor(modeleItem=>item.dqty,new{htmlAttributes=new{Name=“[”+i+“].dqty”,id=“[”+i+”].dqty”,@class=“form control”})
@Html.ValidationMessage(“[”+i+“].dqty“,”,new{@class=“text danger”})
i++;
}
这是为第一行中的文本框生成的html

<input Name="[0].dqty" class="form-control text-box single-line" data-val="true" data-val-number="The field 出貨數量 must be a number." data-val-required="必須填上出貨數量" id="[0].dqty" name="item.dqty" type="text" value="10" />
<span class="field-validation-valid text-danger" data-valmsg-for="[0].dqty" data-valmsg-replace="true"></span>

第二排往前走

<input Name="[1].dqty" class="form-control text-box single-line" id="[1].dqty" name="item.dqty" type="text" value="7" />
<span class="field-validation-valid text-danger" data-valmsg-for="[1].dqty" data-valmsg-replace="true"></span>

模型

[MetadataType(typeof(EorderDetailsMetaData))]
public partial class EorderDetails
{
    public string eo { get; set; }
    public string barcode { get; set; }
    public string itemno { get; set; }
    public string cdesc { get; set; }
    public Nullable<decimal> qty { get; set; }
    public Nullable<decimal> dqty { get; set; }
    public Nullable<decimal> acost { get; set; }
    public string sdate { get; set; }
    public string edate { get; set; }
    public string shop { get; set; }
    public string sname { get; set; }
    public string saddr { get; set; }
    public string shoptel { get; set; }
    public string shopfax { get; set; }
}

public class EorderDetailsMetaData
{
    [Display(Name = "訂單編號")]
    public string eo { get; set; }
    [Display(Name = "電腦條碼")]
    public string barcode { get; set; }
    [Display(Name = "貨品編號")]
    public string itemno { get; set; }
    [Display(Name = "貨品名稱")]
    public string cdesc { get; set; }
    [Display(Name = "訂購數量")]
    [DisplayFormat(DataFormatString = "{0:n0}", ApplyFormatInEditMode = true)]
    public Nullable<decimal> qty { get; set; }
    [Display(Name = "出貨數量")]
    [DisplayFormat(DataFormatString = "{0:n0}", ApplyFormatInEditMode = true)]
    [Required(ErrorMessage = "必須填上出貨數量")]
    public Nullable<decimal> dqty { get; set; }
    [Display(Name = "成本價")]
    [DisplayFormat(DataFormatString = "{0:0.##}", ApplyFormatInEditMode = true)]
    public Nullable<decimal> acost { get; set; }
    public string sdate { get; set; }
    public string edate { get; set; }
    public string shop { get; set; }
    public string sname { get; set; }
    public string saddr { get; set; }
    public string shoptel { get; set; }
    public string shopfax { get; set; }

}
[MetadataType(typeof(eordetailsmetadata))]
公共部分类EorderDetails
{
公共字符串eo{get;set;}
公共字符串条形码{get;set;}
公共字符串itemno{get;set;}
公共字符串cdesc{get;set;}
公共可空数量{get;set;}
公共可为空的dqty{get;set;}
公共可为null的acost{get;set;}
公共字符串sdate{get;set;}
公共字符串edate{get;set;}
公共字符串商店{get;set;}
公共字符串sname{get;set;}
公共字符串saddr{get;set;}
公共字符串shoptel{get;set;}
公共字符串shopfax{get;set;}
}
公共类EorderDetailsMetaData
{
[显示(名称=”訂單編號")]
公共字符串eo{get;set;}
[显示(名称=”電腦條碼")]
公共字符串条形码{get;set;}
[显示(名称=”貨品編號")]
公共字符串itemno{get;set;}
[显示(名称=”貨品名稱")]
公共字符串cdesc{get;set;}
[显示(名称=”訂購數量")]
[DisplayFormat(DataFormatString=“{0:n0}”,ApplyFormatInEditMode=true)]
公共可空数量{get;set;}
[显示(名称=”出貨數量")]
[DisplayFormat(DataFormatString=“{0:n0}”,ApplyFormatInEditMode=true)]
[必需(错误消息=”必須填上出貨數量")]
公共可为空的dqty{get;set;}
[显示(名称=”成本價")]
[DisplayFormat(DataFormatString=“{0:0.###}”,ApplyFormatInEditMode=true)]
公共可为null的acost{get;set;}
公共字符串sdate{get;set;}
公共字符串edate{get;set;}
公共字符串商店{get;set;}
公共字符串sname{get;set;}
公共字符串saddr{get;set;}
公共字符串shoptel{get;set;}
公共字符串shopfax{get;set;}
}

您应该在
for
循环中生成集合,并让助手为您生成正确的html。如果您检查在第二个代码段中发布的html,您将看到问题(两个
名称
属性!)

在主要观点中

@model IList<EorderDetails>
@using(Html.BeginForm())
{
  @Html.EditorFor(m => m)
  <input type="submit" />
}
@model-IList
@使用(Html.BeginForm())
{
@EditorFor(m=>m)
}

要忽略这种奇怪的行为,应该:

  • 将属性定义为数组,而不是ICollection或IList
  • 应在cshtml中使用for,而不是forEach

  • 我不知道这会导致差异。但我认为不应该。我认为这是一个错误应该被修复。

    它有效~!我知道
    foreach
    I
    变量不是最佳实践,但我从未想过这是原因。非常感谢Stephen。
    @model EorderDetails
    @Html.HiddenFor(m => m.eo)
    @Html.DisplayFor(m => m.barcode)
    ....
    
    @model IList<EorderDetails>
    @using(Html.BeginForm())
    {
      @Html.EditorFor(m => m)
      <input type="submit" />
    }