2014-02-27 25 views
0

在我的视图中显示的模型已被用户操作过滤,因此一些原始数据不再存在。注重对ActionLinkEditRow,这是怎么了我的视图显示模式:如何将模型传递回ASP.NET MVC中的Controller?

@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> 
} 

ActionLinkEditRow我能够很容易地通过传递每个项目的ID,但是当我加入currentSelection = Model甚至= Model.ToList() ,控制方法接收的0

这里计数是我使用的操作签名:

//I've tried IQueryable<WeeklyTarget> as well 
public ActionResult EditRow(int? id, List<WeeklyTarget> selection) 

我的问题是我怎么能传递立方米rrent(过滤)模型在视图中显示给控制器动作?我应该以不同的方式来解决这个问题吗?

+0

你正在以一种不寻常的方式去解决它。通常,您的“编辑”操作采用某种类型的ID,并返回从该ID生成的模型。然后,“编辑”的POST操作将采用更新后的模型。 – Jonesopolis

+0

我用'EditRow'替换了'Edit'动作,我打算更新这个视图中的Hours列而不是导航到新的页面。这工作正常,但是当我点击这个按钮模型恢复到未经过滤的视图。我希望数据持续存在。 –

+0

在视图“currentSelection”应该是“选择”为了匹配您的行动方法中的参数。只是我做了类似的事情。 – asunrey

回答

0

这不是实现这一点的正确方法,但是如果您必须这样做,您最好从模型中的每个项目传递Ids而不是模型对象本身。然后在编辑(GET)方法中,您可以使用这些ID从数据库中获取这些完整对象。

虽然这段代码的意图并不清楚。如果每一行都有一个“编辑”链接,那么我会假设点击只会关注特定的行而不是整个列表。更多的细节将有助于更好地回答问题。

更新: 如下所述,最好的方法是使用AJAX(推荐使用jQuery)。当点击一个编辑链接,你应该在JS启动单击处理:

$(".editLink").click(function(){ 
    //Code Here 
}); 

逻辑的点击功能将抓住从该行的数据,使一个AJAX回发到一个控制器的动作。

$.post(urlToAction, data, succuessFunction); 

这将完全适合您,但是您将不得不手动执行大量的数据插入,更新和删除操作。这里有一些非常方便的JS框架,比如Knockout JS,它可以在一些布线/管道工作之前自动为您处理。

我建议你检查一下。

+0

假设我只关心更新该行,特别是带有链接的列上方的小时数列,您是对的。我已经将它从显示更改为基于EditRow被点击的行的编辑器,但是,整个模型刷新并且我对这个视图的任何过滤器都丢失了,我希望它保留下来。这就是为什么我希望当前的模型与它一起传递。看来这是错误的方式去做,什么是正确的方式? –

+0

你能否详细说一下“整个模型刷新” –

+0

这个动作基本上重新回到了索引页面。在将手动过滤器应用于此视图之前,只显示某些数据,但调用此动作会重新发送数据,而不会发生任何持久数据,我应该问如何仅更新页面的某些部分而不必重新发送数据?听起来我应该现在使用asynchronus js ...是正确的方法吗? –

相关问题