2014-02-27 27 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 ...是正確的方法嗎? –

相關問題