在 MVC 中将数据从视图传递到控制器时,数据列表变为空
Posted
技术标签:
【中文标题】在 MVC 中将数据从视图传递到控制器时,数据列表变为空【英文标题】:List of data is getting null when passing data from view to controller in MVC 【发布时间】:2015-10-13 09:22:05 【问题描述】:我是 mvc 的新手。我想将数据列表从视图发送到控制器。我可以传递一名员工的详细信息,但不能传递列表。请提出一些建议来解决它。
错误:-
我需要在控制器中获取 Lidt。
public class EmpDetails
public int Id get; set;
public string Name get; set;
public int OldSeq get; set;
public int NewSeq get; set;
public class DetailsList
public int Id get; set;
public IEnumerable<EmpDetails> EmpDetailsList get; set;
在控制器中有两个方法get和post。在 post 方法中获取 id 但不是 list.it 以 null 的形式出现。
[HttpGet]
public ActionResult EmployeeDetails()
List<EmpDetails> c2 = new List<EmpDetails>();
EmpDetails model = new EmpDetails();
model = new EmpDetails();
model.Id = 2;
model.Name = "Alex";
model.OldSeq = 4;
model.NewSeq = 5;
c2.Add(model);
DetailsList abc = new DetailsList();
abc.Id = 1;
abc.EmpDetailsList = c2;
return View(abc);
[HttpPost]
public ActionResult EmployeeDetails(DetailsList model)
return View("EmployeeDetails");
在视图中,我正在循环数据并显示。
@using MvcDemo.Models
@model DetailsList
@using (html.BeginForm())
@Html.ValidationSummary(true)
@Html.EditorFor(modelItem => modelItem.Id)
<table>
@foreach (var item in Model.EmpDetailsList)
<tr>
<td>
@Html.EditorFor(modelItem => item.Id)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Name)
</td>
<td>
@Html.TextBoxFor(modelItem => item.OldSeq)
</td>
<td>
@Html.TextBoxFor(modelItem => item.NewSeq)
</td>
</tr>
</table>
<input type="submit" value="Create" />
【问题讨论】:
您不能使用foreach
循环。您必须使用for
循环(属性必须为IList<EmpDetails>
或者您必须使用自定义EditorTemplate
更多详情请参阅this answer
感谢您的回复。您能解释一下为什么我需要使用 for 循环吗?
另请参阅 this answer 以获取 EditorFor()
方法的示例
@nichu09 - 这是使用 for
循环方法进行绑定的方式,生成的 html 将与您的模型匹配,而您的 post
将起作用。
没错!当您将其可视化时,它会更有意义。
【参考方案1】:
使用这样的编辑器模板。
-
在您的
Views/Shared
文件夹中创建EditorTemplates
文件夹。
在该文件夹中创建一个名为 EmpDetails.cshtml
的文件。
将您的 foreach 标记放在该文件中,例如
@model EmpDetails
<tr>
<td>
@Html.EditorFor(modelItem => Model.Id)
</td>
<td>
@Html.TextBoxFor(modelItem => Model.Name)
</td>
<td>
@Html.TextBoxFor(modelItem => Model.OldSeq)
</td>
<td>
@Html.TextBoxFor(modelItem => Model.NewSeq)
</td>
</tr>
然后将您的foreach
替换为对@Html.EditorTemplateFor
方法的调用,例如
@using MvcDemo.Models
@model DetailsList
@using (Html.BeginForm())
@Html.ValidationSummary(true)
@Html.EditorFor(modelItem => modelItem.Id)
<table>
@Html.EditorFor(m=>m.EmpDetailsList)
</table>
<input type="submit" value="Create" />
【讨论】:
【参考方案2】:感谢您的快速回复。在@stephen 评论的帮助下,我将 IEnumerable 集合更改为 List。然后我使用 for 循环而不是 for each。请检查以下代码。
public class DetailsList
public int Id get; set;
public List<EmpDetails> EmpDetailsList get; set;
<table>
@for(int item = 0; item < Model.EmpDetailsList.Count;item++ )
<tr>
<td>
@Html.EditorFor(modelItem => modelItem.EmpDetailsList[item].Id)
</td>
<td>
@Html.TextBoxFor(modelItem => modelItem.EmpDetailsList[item].Name)
</td>
<td>
@Html.TextBoxFor(modelItem => modelItem.EmpDetailsList[item].OldSeq)
</td>
<td>
@Html.TextBoxFor(modelItem => modelItem.EmpDetailsList[item].NewSeq)
</td>
</tr>
</table>
【讨论】:
【参考方案3】: public ActionResult EmployeeDetails()
List<EmpDetails> c2 = new List<EmpDetails>();
EmpDetails model = new EmpDetails();
model = new EmpDetails();
model.Id = 2;
model.Name = "Alex";
model.OldSeq = 4;
model.NewSeq = 5;
c2.Add(model);
DetailsList abc = new DetailsList();
abc.Id = 1;
// abc.EmpDetailsList = c2;
//change this might help
abc.EmpDetailsList = new List<EmpDetails>(c2);
return View(abc);
【讨论】:
也许添加一些关于如何回答问题的细节会有所帮助。 试试这个 abc.EmpDetailsList =new List以上是关于在 MVC 中将数据从视图传递到控制器时,数据列表变为空的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.Net MVC 5 中将 javascript 数组从视图传递到控制器