C# ASP.Net MVC模型绑定IEnumerable失败
我有一个应用程序,它应该在一些文本字段中显示本地数据库中的对象列表,并带有编辑它们的选项。代码在编辑时从列表中正确返回一个对象,但我的控制器没有看到任何更改。我尝试过从C# ASP.Net MVC模型绑定IEnumerable失败,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,我有一个应用程序,它应该在一些文本字段中显示本地数据库中的对象列表,并带有编辑它们的选项。代码在编辑时从列表中正确返回一个对象,但我的控制器没有看到任何更改。我尝试过从IEnumerable切换到IList,但没有成功。关于为什么失败(下面的代码)有什么想法吗 型号: public class EmployeeProject { [Required()] public Int32 EmployeeProjectID { get; set; } [Required()]
IEnumerable
切换到IList
,但没有成功。关于为什么失败(下面的代码)有什么想法吗
型号:
public class EmployeeProject
{
[Required()]
public Int32 EmployeeProjectID { get; set; }
[Required()]
[Range(0, 999999999, ErrorMessage = "Not a valid ID")]
public Int32 EmployeeID { get; set; }
[Required()]
public Int32 ProjectID { get; set; }
[Display(Name = "Name")]
public string EmployeeName { get; set; }
[Display(Name = "Project")]
public string ProjectName { get; set; }
[Range(0.0, 1.0, ErrorMessage = "Must be between 0 and 1")]
public double Hour1 { get; set; }
....
public EmployeeProject()
{
EmployeeID = 0;
ProjectID = 0;
Hour1 = 0;
....
}
}
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "EmployeeProjectID,EmployeeID,ProjectID,EmployeeName,ProjectName,Hour1,Hour2,Hour3,Hour4")] EmployeeProject employeeProject)
{
if (ModelState.IsValid)
{
db.Entry(employeeProject).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(employeeProject);
}
视图:
@model IEnumerable
....
@DisplayNameFor(model=>model.EmployeeName)
@DisplayNameFor(model=>model.ProjectName)
....
@foreach(模型中的var项目)
{
使用(Html.BeginForm(“编辑”,“雇员项目”,项目))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model=>item.employeeprojectd)
@Html.HiddenFor(model=>item.EmployeeID)
@Html.HiddenFor(model=>item.ProjectID)
@DisplayFor(模型=>item.EmployeeName)
@Html.ValidationMessageFor(model=>item.EmployeeName)
@DisplayFor(model=>item.ProjectName)
@Html.ValidationMessageFor(model=>item.ProjectName)
....
}
}
奇怪的是,在action方法中,您返回一个实例
返回视图(employeeProject)代码>而在您的视图中,您希望看到一个IEnumerable
原因是
@model IEnumerable<WebApplication1.Models.EmployeeProject>
(或者)如果您真的想要,请更改您的操作方法,以获取employeeProject
public ActionResult Edit(List<EmployeeProject> employeeProjects)
{
公共行动结果编辑(列出员工项目)
{
以下是我在一个项目中的表现
@model List<Game>
@using (Html.BeginForm(FormMethod.Post))
{
@Html.AntiForgeryToken()
@for (int i = 0; i < Model.OrderGames.Count(); i++)
{
<tr>
<td>@Html.EditorFor(m => m.OrderGames[i].GameId})</td>
<td>@Html.EditorFor(m => m.OrderGames[i].NumberOfPlayers})</td>
<td>@Html.EditorFor(m => m.OrderGames[i].GameTime})</td>
<td>@Html.EditorFor(m => m.OrderGames[i].Price})</td>
</tr>
}
}
@型号列表
@使用(Html.BeginForm(FormMethod.Post))
{
@Html.AntiForgeryToken()
@对于(int i=0;im.OrderGames[i].GameId})
@EditorFor(m=>m.OrderGames[i].NumberOfPlayers})
@EditorFor(m=>m.OrderGames[i].GameTime})
@EditorFor(m=>m.OrderGames[i].Price})
}
}
在这里,您可以将其转换为您的项目。
你的控制器应该是这样的
[Httppost]
public ActionResult Edit(List<Game> Games){}
[Httppost]
公共行动结果编辑(列表游戏){}
最初我应该包括这个,但是从我在控制器中的编辑,它返回到返回列表的视图。我已经更新了question@Daniel,那是完全错误的。你应该考虑在不同的页面中分离它们,或者为此创建一个局部视图。这不是特别有用,我不知道我的解决方案有什么问题(虽然显然有些东西不对,但不能和你争论)。请您更具体地说明错误所在以及单独页面/部分视图的用途是什么?您的模型是一个集合,不能使用foreach
循环为集合生成表单控件(生成的name
属性与您的模型没有关系,因此不会绑定任何内容)。但是,然后为集合中的每个项目创建一个表单,并且一次只能回发一个表单,这样做没有意义。然后,您的代码将开始抛出异常,因为在POST方法中,您将一个EmployeeProject
返回到一个视图,该视图需要IEnumerable
。显示GET方法。您正在尝试编辑一个EmployeeProject
还是一组EmployeeProject
@model List<Game>
@using (Html.BeginForm(FormMethod.Post))
{
@Html.AntiForgeryToken()
@for (int i = 0; i < Model.OrderGames.Count(); i++)
{
<tr>
<td>@Html.EditorFor(m => m.OrderGames[i].GameId})</td>
<td>@Html.EditorFor(m => m.OrderGames[i].NumberOfPlayers})</td>
<td>@Html.EditorFor(m => m.OrderGames[i].GameTime})</td>
<td>@Html.EditorFor(m => m.OrderGames[i].Price})</td>
</tr>
}
}
[Httppost]
public ActionResult Edit(List<Game> Games){}