绑定(包含= ...)参数未绑定模型到操作

时间:2016-12-21 00:30:47

标签: c# asp.net-mvc razor

我正在尝试将模型绑定到ActionResult,它将以null形式出现。因此它知道放置的模型,但所有值都为空。

我的ActionResult是:

public ActionResult Complete([Bind(Include = "ToDoId,Complete")] ViewModels.ToDo @todo)
        {
            using (var db = new KnightOwlContext())
            {
                DashboardHelper dashboardHelper = new DashboardHelper(db);

                dashboardHelper.CompleteToDo(todo.ToDoId, todo.Complete);

                return RedirectToAction("Index", "Home");
            }
        }

我触发它的按钮是部分视图:

@model IEnumerable<KnightOwlCRM.ViewModels.ToDo>

<div class="col-lg-4">
    <div class="ibox float-e-margins">
        <div class="ibox-title">
            <h5>To-Do</h5>
            <div class="ibox-tools">
                <a class="collapse-link">
                    <i class="fa fa-chevron-up"></i>
                </a>
                <a class="close-link">
                    <i class="fa fa-times"></i>
                </a>
            </div>
        </div>
        <div class="ibox-content">

            <p class="small"><i class="fa fa-hand-o-up"></i> Drag tasks to re-order them</p>

            <ul class="sortable-list connectList agile-list ui-sortable">
                @foreach (var item in Model)
                {
                    <li class="@item.Priority">
                        @item.Text
                        <div class="agile-detail">
                            @Html.ActionLink("Done", "Complete", "Home", new { id = item.ToDoId }, new { @class = "pull-right btn btn-xs btn-primary" })
                            <i class="fa fa-clock-o"></i> @item.Date
                        </div>
                    </li>
                }
            </ul>
        </div>
    </div>
</div>

并且在引用的项目中使用Entity Framework更新数据库中的记录:

public void CompleteToDo(int toDoId, bool complete)
        {
            var original = Db.ToDoes.Find(toDoId);

            if (original != null)
            {
                original.Complete = true;
                Db.SaveChanges();
            }
        }

基本上我的最后阶段是按下Attaton并将数据库中的记录从False更新为True。

1 个答案:

答案 0 :(得分:1)

您需要使用具有匹配键的表单数据发送这两个参数值。一种方法是将其保存在表单中并使用http post方法提交(因为您的方法尝试更新数据。任何更新数据的操作方法都应该是HttpPost操作方法)。

@foreach (var item in Model)
{
    <li class="@item.Priority">@item.Text             
        <form action="@Url.Action("Complete","Home")" method="post">
           <input type="hidden" name="ToDoId" value="@item.ToDoId" />
           <input type="hidden" name="Complete" value="true" />
           <input type="submit" value="Done" />
        </form>
         <span>@item.Date</span>
       </div>
    </li>
}

我将Complete字段的隐藏输入的值硬编码为true,因为我不知道在那里使用什么值(您没有在问题中提供该信息< / em>的)。根据需要将其替换为实际值。 但请记住,用户可以使用浏览器开发工具更新这些值。因此,请考虑根据需要在服务器中设置值。