【发布时间】: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 }) { <input type="submit" value="Done" /> }并将方法更改为[HttpPost] public ActionResult Complete(int id)(并使用dashboardHelper.CompleteToDo(id, true);)
标签: c# asp.net-mvc razor