【问题标题】:Bind (Include = ...) Parameter Not binding Model to Action绑定(包括 = ...)参数未将模型绑定到操作
【发布时间】:2016-12-21 08:45:39
【问题描述】:

我正在尝试将模型绑定到 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>

在引用的项目中使用实体框架更新数据库中的记录:

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

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

基本上我的结局是按下一个按钮并将数据库中的记录从 False 更新为 True。

【问题讨论】:

  • 首先,更新记录不应该是 GET 方法(我们使用表单并 POST 值)。但是根据你最后一个问题,你没有传递模型的值,它包含一个名为ToDoId 的属性,而不是一个名为id 的属性,这是你的链接传递的。在任何情况下,GET 方法都不应包含模型参数
  • 只需使用@using(Html.BeginForm("Complete", "Home", new { id = item.ToDoId }) { &lt;input type="submit" value="Done" /&gt; }并将方法更改为[HttpPost] public ActionResult Complete(int id)(并使用dashboardHelper.CompleteToDo(id, true);

标签: c# asp.net-mvc razor


【解决方案1】:

您需要将这 2 个参数值与具有匹配键的表单数据一起发送。一种方法是将其保存在表单中并使用 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,因为我不知道该使用什么值(您没有在问题中提供该信息) .根据需要将其替换为实际值。 但请记住,用户可以使用浏览器开发工具更新这些值。因此,请考虑根据需要在服务器中设置值。

【讨论】:

  • “但请记住,用户可以使用浏览器开发工具更新这些值。因此请考虑根据需要在服务器中设置这些值。” - 我该怎么做?
  • 如果它总是正确的,当你在你的操作方法中调用你的方法时传递true,比如dashboardHelper.CompleteToDo(todo.ToDoId, true)
  • 谢谢 - 如果我在该表单中添加一个按钮,那么我会接受它,然后用户点击会触发操作?
  • 是的!对不起,我错过了那部分。现在更新答案。
猜你喜欢
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2021-07-21
  • 2013-02-08
  • 1970-01-01
相关资源
最近更新 更多