我正在尝试将模型绑定到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。
答案 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>的)。根据需要将其替换为实际值。 但请记住,用户可以使用浏览器开发工具更新这些值。因此,请考虑根据需要在服务器中设置值。