【问题标题】:How to model bind from view to controller via nested view如何通过嵌套视图建模从视图到控制器的绑定
【发布时间】:2015-04-28 21:49:27
【问题描述】:

我似乎无法将Employees.cshtml 视图中的复选框中的员工ID 值传递给Delete Post 操作方法。删除操作方法返回 Delete.cshtml 视图,该视图呈现Employees.cshtml,因为它位于Shared 文件夹下的EditorTemplates 文件夹中。当我点击提交时,我似乎无法通过检查的@Model.Ids 的 IEnumerable。

我想要做的是删除在Employees.cshtml中派生检查值的每个已检查条目。

显然问题是模型绑定(我认为)将通过从 Delete.cshtml 页面提交的按钮完成,我该如何更改?

删除操作方法。

    [HttpGet]
    public ActionResult Delete()
    {
        return View(db2.Employees.ToList());
    }

Delete Post 操作方法。

    [HttpPost]
    public ActionResult Delete(IEnumerable<int> EmployeeIDToDelete)
    {
        if (EmployeeIDToDelete != null)
        {
            var employeesToDelete = db2.Employees.Where(x => EmployeeIDToDelete.Contains(x.Id)).ToList();

            foreach (var item in employeesToDelete)
            {
                db2.Employees.Remove(item);
            }
            db2.SaveChanges();
            RedirectToAction("Delete");
        }
        return View(db2.Employees.ToList());
    }

我的删除视图

@model IEnumerable<MVC_Example2___ADO.Models.Employees>

@{
    ViewBag.Title = "Delete";
}
<html>
<body>
    @using (Html.BeginForm())
    {
        <table align="center">
            <thead>
                <tr>
                    <td>Check</td>
                    <td>Photo</td>
                    <td>Name</td>
                    <td>Gender</td>
                </tr>
            </thead>
            <tbody>
                @Html.EditorForModel()
            </tbody>
        </table>
        <input type="submit" name="submit" value="Delete Entries" />
    }
</body>
</html>

我的员工视图

@model MVC_Example2___ADO.Models.Employees

<tr>
    <td><input type="checkbox" name="employeeIdsToDelete" id="employeeIdsToDelete" value="@Model.Id" /></td>
    <td>@Html.Image(@Model.Photo, @Model.AlternateText, 125, 130)</td>
    <td>@Model.FullName</td>
    <td>@Model.Gender</td>
</tr>

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 model-binding


    【解决方案1】:

    您已将复选框命名为 name="employeeIdsToDelete",但 POST 方法的参数是 IEnumerable&lt;int&gt; EmployeeIDToDelete(不是复数)。名称必须匹配。

    还请注意,您应该从输入中删除 id="employeeIdsToDelete",因为这会生成重复的 id 属性,这是无效的 html。

    【讨论】:

    • 由于controller action上的参数是IEnumerable,相信他的name属性上也需要索引。
    • @Tobias,它对于值类型不是必需的。 DefaultModelBinder 仍将绑定它。但与往常一样,首选方法是具有bool IsSelected 属性并使用@CheckBoxFor(m =&gt; m.IsSelected) 的视图模型
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多