MVC 表单提交不将更新的模型传输回列表<class>的操作方法



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
    }
}

最新更新