C# EF 6 ModelState.IsValid在Id上始终为false

C# EF 6 ModelState.IsValid在Id上始终为false,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个代码优先的项目MVC5。我有以下模型: public class Person { public int Id { get; set; } public string ItemCode { get; set; } public string Description { get; set; } } 在我看来,我有一个带有文本框的表格: @model IList<ItemApp.Models.Item> @{ ViewBag.Title = "

我有一个代码优先的项目MVC5。我有以下模型:

public class Person
{
    public int Id { get; set; }
    public string ItemCode { get; set; }
    public string Description { get; set; }
}
在我看来,我有一个带有文本框的表格:

@model IList<ItemApp.Models.Item>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@using(Html.BeginForm("Process", "Items", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <button type="button" class="btn btn-primary" id="btnAddRow">AddRow</button>
    <input type="submit" class="btn btn-success" value="process"/>
<table class="table">
    <tr>
        <th>
            ItemCode
        </th>
        <th>
            Description
        </th>
    </tr>

        @for (int i = 0; i < Model.Count(); i++ )
        {
            <tr>
                <td>
                    <input type="hidden" value="@i" name="Index" />

                    @Html.TextBoxFor(item => item[i].ItemCode)
                </td>
                <td>
                    @Html.TextBoxFor(item => item[i].Description)
                </td>

            </tr>
        }
    <tr>
        <td>
            <input type="hidden" value="4" name="Index" />
            <input type="hidden" name="[4].Id" />
            <input type="text" name="[4].ItemCode" />
        </td>
        <td>
            <input type="text" name="[4].Description" />
        </td>
    </tr>

</table>

}
@model-IList
@{
ViewBag.Title=“Index”;
}
指数
@使用(Html.BeginForm(“流程”、“项目”、FormMethod.Post))
{
@Html.AntiForgeryToken()
阿德罗
项目代码
描述
@对于(int i=0;iitem[i].ItemCode)
@Html.TextBoxFor(item=>item[i].Description)
}
}
正如您在我的视图中看到的,我添加了一行。运行te项目时,前3行通过数据库填充。当我在最后一行输入值并提交表单时,您可以看到我的操作收到一个项目对象列表(Count=4)。我的流程操作如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Process(List<Item> items)
{
    if(ModelState.IsValid)
    {
        foreach(var item in items)
        {            
            if(item.Id != 0)
            {
                db.Entry(item).State = System.Data.Entity.EntityState.Modified;
            }
            else
            {
                db.Items.Add(item);
            }

            db.SaveChanges();
        }

        return RedirectToAction("Index");
    }

    return RedirectToAction("Index");
}
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果流程(列表项)
{
if(ModelState.IsValid)
{
foreach(项目中的var项目)
{            
如果(item.Id!=0)
{
db.Entry(item).State=System.Data.Entity.EntityState.Modified;
}
其他的
{
db.Items.Add(项目);
}
db.SaveChanges();
}
返回操作(“索引”);
}
返回操作(“索引”);
}
问题是my ModelState.IsValid返回false。这是因为最后一行(新输入的)的Id=0。
我想要的是提交表单,更新数据库中已经存在的所有项目并添加一个新项目。

您的
ModelState
不是无效的,因为
Id=0
(零是
int
的有效值)它是无效的,因为您回发了第四个项目的
null
。您需要将您的视图更改为

<input type="hidden" name="[4].Id" value="0"/>

然而,您的代码是不灵活的,并且只有在您有3个现有项并且只允许您添加一个新项的情况下才能工作。建议您查看答案,并动态(和删除)集合中的项目。

我假设该类的名称实际上是
项目
,而不是
个人
,根据您的视图和控制器方法,我错过了
value=“0”
部分。这样,调试器为项[4].Id向我显示了0,但它实际上没有值。我完全知道代码是不灵活的。这将是我的下一步。是的,它向您显示
0
,因为model binder试图将其设置为
null
(但无法),所以您只能看到默认值。调试时,需要检查
ModelState
属性中的值(这将显示有错误的属性)
@Html.HiddenFor(item => item[i].Id)