我的视图中显示的模型已按用户操作进行过滤,因此某些原始数据不再存在。注意ActionLink
的{{1}},这就是我的视图显示模型的方式:
EditRow
在@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.User.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.User.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.User.Email)
</td>
<td>
@item.Weekly.WeekBeginning.ToShortDateString() - @item.Weekly.WeekEnding.ToShortDateString()
</td>
<td>
@(item.WeeklyTargetId != ViewBag.Edited ? Html.DisplayFor(modelItem => item.Hours) : Html.EditorFor(modelItem => item.Hours))
</td>
<td>
//here is the line I am trying to pass the model through:
@Html.ActionLink("Edit", "EditRow", new {id = item.WeeklyTargetId, currentSelection = Model}) |
@Html.ActionLink("Details", "Details", new {id = item.WeeklyTargetId}) |
@Html.ActionLink("Delete", "Delete", new {id = item.WeeklyTargetId})
</td>
</tr>
}
ActionLink
我能够轻松传递每个项目的ID,但是当我添加EditRow
甚至currentSelection = Model
时,控制器方法会收到数为0.
以下是我正在使用的操作签名:
= Model.ToList()
我的问题是如何将视图中显示的当前(filterd)模型传递给控制器操作?我应该以不同的方式解决这个问题吗?
答案 0 :(得分:0)
这不是实现它的正确方法,但是如果你必须这样做,你最好从模型中的每个项目而不是模型对象本身传递ID。然后在Edit(GET)方法中,您可以使用这些ID从DB获取这些完整对象。
虽然这个代码的意图并不清楚。如果每一行都有一个“编辑”链接,那么我会假设点击那个只关心那个特定的行而不是整个列表。更多细节将有助于更好地回答这个问题。
更新: 如下所述,最好的方法是使用AJAX(推荐使用jQuery)。单击编辑链接后,您应该在JS中启动单击处理程序:
$(".editLink").click(function(){
//Code Here
});
click函数的逻辑是从行中获取数据并使AJAX Post回到控制器操作。
$.post(urlToAction, data, succuessFunction);
这对您来说非常合适,但您必须手动执行大量数据插入,更新和删除操作。有一些非常方便的JS框架,比如Knockout JS,它会在你预先进行一些布线/管道工作后自动为你处理。
我建议你检查一下。