C# EF 6 ModelState.IsValid在Id上始终为false
我有一个代码优先的项目MVC5。我有以下模型: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 = "
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)