My VIEW ( success.cshtml
) 如下
@model IList<AzSample.Models.Employeelist>
@using (Html.BeginForm("Save","Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
<h2>Employees Details</h2>
<div>
<table>
<tr>
<th>Id</th>
</tr>
@foreach (var emp in Model)
{
<tr>
<td>@emp.ID</td>
</tr>
}
</table>
<button type="submit" value="save" onclick="@Url.Action("Save", "Home")">Save</button>
</div>
}
我的家庭控制器如下
public class HomeController : Controller
{
public ActionResult Import(HttpPostedFileBase excelfile)
{
//Code to get data from Excel sheet
List<Employeelist> obj = new List<Employeelist>();
for( int row =2; row <=range.Rows.Count; row++)
{
Employeelist emp = new Employeelist();
emp.ID =((Excel.Range)range.Cells[row,1]).Text;
obj.Add(emp);
}
return View("success", obj);
}
[HttpPost]
public ActionResult Save(List<Employeelist> empLIst)
{
// Code fro storing the data got from VIEW.
}
}
我的模型如下
public class Employeelist
{
public string ID { get; set; }
}
我正在从其他页面调用导入操作方法,并从Excel工作表中读取数据并将其显示在success.cshtml
上。直到这里它工作正常。
按钮时,调试点将返回到"保存"操作方法,但是数据(即 List<Employeelist>
,基本上所有 Employeelist.ID 的 ) 都是空的?缺少什么?
empList
的数据永远不会随表单一起提交。应呈现<input>
字段以提交数据。
@for(int i = 0; i < Model.Count(); ++i) {
@Html.HiddenFor(m => m[i].Id)
// send other properties
}
绑定到索引属性非常重要,以便 MVC 模型绑定程序可以将其绑定为集合。 @Html.HiddenFor(m => m.Id)
行不通。
另请参阅模型绑定到列表 MVC 4
--编辑--
正如 Stephen 所指出的,模型绑定器将尝试使用索引绑定它,因此您的 c# 模型必须实现 IList<T>
。
另一个陷阱是非顺序指数。
你应该在 MVC TempData> ASP.NET 使用它吗?
ASP.NET MVC TempData 字典用于在控制器操作之间共享数据。TempData 的值将一直保留到读取或当前用户的会话超时。在 TempData 中保留数据在重定向等情况下非常有用,当需要超出单个请求的值时。
代码将是这样的:
导入方式:
public ActionResult Import(HttpPostedFileBase excelfile)
{
//Code to get data from Excel sheet
for( int row =2; row <=range.Rows.Count; row++)
{
Employeelist emp = new Employeelist();
emp.ID =((Excel.Range)range.Cells[row,1]).Text;
obj.Add(emp);
}
TempData["doc"] = obj;
return View("success", obj);
}
视图:
@model IEnumerable<AzSample.Models.Employeelist>
@using (Html.BeginForm("Save","Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
<h2>Employees Details</h2>
<div>
<table>
<tr>
<th>Id</th>
</tr>
@{var list = (List<AzSample.Models.Employeelist>)TempData["doc"];}
@{TempData["doc"] = list;}
@foreach (var emp in list)
{
<tr>
<td>@emp.ID</td>
</tr>
}
</table>
<button type="submit" value="save" onclick="@Url.Action("Save", "Home")">Save</button>
</div>
}
保存方法:
[HttpPost]
public ActionResult Save()
{
if (TempData["doc"] != null)
{
// Your code will be here
}
}