【问题标题】:Can't get CheckBox to update model in MVC Razor Using Html.CheckBoxFor无法使用 Html.CheckBoxFor 让 CheckBox 更新 MVC Razor 中的模型
【发布时间】:2013-08-30 12:52:40
【问题描述】:

似乎有很多问题涉及类似的问题,但我还没有找到一个可以澄清我遇到的问题的问题。

我正在尝试创建一个简单的任务列表,看起来像这样(抱歉无法发布图片):

| CheckBox | Title | DeleteLink |
| CheckBox | Title | DeleteLink |
| CheckBox | Title | DeleteLink |

我无法获取更新模型的复选框(我想要一个复选框单击以调用相关控制器来设置模型中的更新状态)

我可能有错误的控制器签名/参数之类的!

目前,如果我选中一个复选框,然后删除另一个任务,则会呈现旧的复选框状态(模型尚未更新)

这是我的模型

namespace TaskList.Models
{
    public class TaskListModel
    {
        public List<TaskItem> Tasks { get; set; }
    }
    public class TaskItem
    {
        [Key]
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime EntryDateTime { get; set; }
        public bool IsDone { get; set; }
    }
}

这是我的看法

@using (@Html.BeginForm("Edit", "Home"))
{
    <table>

            @for (int i = 0; i < Model.Tasks.Count; i++)
            {
                <tr>
                    <td>
                        @Html.CheckBoxFor(m => m.Tasks[i].IsDone)
                    </td>
                    <td>
                        @Html.EditorFor(m => m.Tasks[i].Title)
                    </td>
                    <td>
                        @Html.ActionLink("Delete", "Delete", new { id = Model.Tasks[i].Id })
                    </td>
                </tr>
            }

    </table>
}

以及我对控制器操作的尝试(未调用)

// Mark a task as complete
[HttpPost]
public ActionResult Edit(int id = 0, bool isChecked = false)
{
    // database logic
    TaskItem taskItem = _db.Tasks.Find(id);
    taskItem.IsDone = isChecked;

    _db.SaveChanges();

    return RedirectToAction("Index");
}

根据要求删除方法

// Delete a task
public ActionResult Delete(int id = 0)
{
    if (id > 0)
    {
        // database logic
        TaskItem taskItem = _db.Tasks.Find(id);
        _db.Tasks.Remove(taskItem);

        _db.SaveChanges();
    }

    return RedirectToAction("Index");
}

我已尝试将此 javascript 添加到视图中

$(function () {
    $(':checkbox').change(function () {
        $.ajax({
            url: '@Url.Action("Edit", "Home")',
            type: 'POST',
            data: { id: $(this).id, isChecked: $(this).is(':checked') },
            success: function (result) {

            }
        });
    });
});

不确定是否被调用

还是没有欢乐

【问题讨论】:

  • 能否提供您的“删除”方法

标签: c# asp.net-mvc razor checkboxfor


【解决方案1】:

您只需要在复选框被选中时提交表单。

【讨论】:

【解决方案2】:

感谢 Joan 为我指明了建设性的方向。我意识到我需要一些 jQuery/Ajax 来解决这个问题,并进行更多搜索以找到解决方案。

在一个js文件中使用了以下脚本

$(function () {
    $("input[type=checkbox]").click(function () {
        var data_id = $(this).data("id");
        $.ajax({
            url: 'Home/Edit',
            type: 'POST',
            data: { id: data_id, isChecked: $(this).is(':checked') },
            success: function (result) {

            }
        });
    });
});

将视图中的代码更改为:

@using (@Html.BeginForm())
{
    <table>
        @for (int i = 0; i < Model.Tasks.Count; i++)
        {
            <tr>
                <td>
                    @Html.CheckBoxFor(m => m.Tasks[i].IsDone, new { data_id=Model.Tasks[i].Id })
                </td>
                <td>
                    @Html.EditorFor(m => m.Tasks[i].Title)
                </td>
                <td>
                    @Html.ActionLink("Delete", "Delete", new { id = Model.Tasks[i].Id })
                </td>
            </tr>
        }
    </table>
}

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 2013-12-04
    • 2018-09-07
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2011-08-09
    相关资源
    最近更新 更多