2012-07-19 56 views
1

我有MVC2視圖,其中有一個網格和圖像按鈕。點擊圖像按鈕時,它會將網格的currentPage,filter和orderBy域的數據傳遞給另一個控制器。代碼是,爲什麼ViewData不起作用

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MaintenanceEditableViewModel>" %> 

"Image button" 
<a href="<%: Url.Action("ExportToExcel", "ExportExcelButton", new { resourceId = ViewData["resourceId"], pagenum = ViewData["page"], orderBy = ViewData["orderBy"], filter = ViewData["filter"] }) %>"> 
<img src='<%: Url.Content("~/Content/Images/ExportExcelButton.gif") %>' /></a> 

"Grid" 
<%= Html.Telerik().Grid<MaintenanceAthletesResultsViewModel>() 
.Name("Grid") 
.TableHtmlAttributes(new { style = "font-size:8pt;" }) 
.HtmlAttributes(new { style = "height:335px" }) 
.DataKeys(k => k.Add(k2 => k2.ResultID)) 
.DataBinding(dataBinding => dataBinding.Ajax() 
.Select("AthletesResultsAjax", "Maintenance") 
... 

"Action to initialize the grid in Maintenance controller" 
public ActionResult AthletesResults(string id, bool editable) 
{ 
ViewData["resourceId"] = id; 
this._resourceBL.PopulateMaintenanceResourcesViewData(id, this.SelectedSport()); 

MaintenanceEditableViewModel model = new MaintenanceEditableViewModel { Editable = editable }; 
return View(model); 
} 

[GridAction] 
public ActionResult AthletesResultsAjax(string id, int page, string orderBy, string filter) 
{ 
List<MaintenanceAthletesResultsViewModel> model = null; 

if (!string.IsNullOrEmpty(id)) 
{ 
ViewData["page"] = page; 
ViewData["orderBy"] = orderBy; 
ViewData["filter"] = filter; 

model = this._resourceBL.GetMaintenanceAthletesResultsViewModel(int.Parse(id)); 
} 

return View(new GridModel(model)); 
} 

public ActionResult ExportToExcel(string resourceId, string pagenum, string orderBy, string filter) 

奇怪的是,只有ViewData [「resourceId」](在視圖的初始化中設置)能夠被傳遞。 ViewData [「page」],ViewData [「orderBy」],ViewData [「filter」](在網格ajax動作中設置)這3個參數無法傳遞。在ExportToExcel中所有3個都是空的,所以我認爲它們沒有正確存儲在ViewData中(我不確定如何在按下圖像按鈕時檢查ViewData)。我很困惑,需要幫助。

感謝

回答

1

我不明白如何/你在哪裏發送這些參數到AthletesResultsAjax行動。您正在使用的dataBinding.Ajax()。Select()函數的簽名僅指定動作和控制器名稱。怎麼知道這些值是什麼?您需要指定一個routeValues對象來將適當的數據發送到控制器操作。如果您調試了代碼並在您的ajax操作中設置了斷點,那麼實際的值是否會通過?我可能在這裏相當不錯,但我認爲你的問題更多的是在這方面,而不是數據如何存儲在ViewData中。

+0

AthletesResults當網格頁碼/ orderBy/filter已更改時,會調用Ajax。我檢查了調試和值是正確的,例如當頁面編號變爲3時page = 3。奇怪的是,當它們通過ViewData在視圖中的Url.Action中訪問時,值將丟失。 – user585440 2012-07-19 19:58:18

+0

嗯,對不起,我想我確實相當不錯。 – 2012-07-19 20:01:55

1

我認爲問題在於ViewData主要用於從Controller傳遞數據到View並且在你的情況下你有Controller - > View - > Controller。我認爲Telerik知識庫提供了一個很好的解決方案,可以爲您的導出操作提供額外的數據。 Telerik Knowledge Base

<%= Html.ActionLink("Export to Excel", "Export", new { page = 1, orderBy = "~", filter = "~"}, new { id = "exportLink" }) %> 

<script type="text/javascript"> 
    function onDataBound() { 
     var grid = $(this).data('tGrid'); 
     var $exportLink = $('#exportLink'); 
     var href = $exportLink.attr('href'); 
     href = href.replace(/page=([^&]*)/, 'page=' + grid.currentPage); 
     href = href.replace(/orderBy=([^&]*)/, 'orderBy=' + (grid.orderBy || '~')); 
     href = href.replace(/filter=(.*)/, 'filter=' + (grid.filterBy || '~')); 
     $exportLink.attr('href', href); 
    } 
</script> 

該腳本動態地更新接收到數據時呈現(OnDataBound)屏幕&導出鏈接的網址。它應該很好地綁定在Controller端。

如果您更熟悉JavaScript,那麼您應該將一個單擊事件放到導出按鈕上,並在JavaScript端進行GET請求。那麼你沒有做出醜陋的網址修改。

我希望這有助於!

+0

謝謝,我想出了使用jQuery。然而,仍然不清楚爲什麼ViewData不能工作,因爲ViewData在控制器中設置,並且應該能夠在視圖中訪問。 – user585440 2012-07-20 21:04:11

+0

如果您使用開發人員工具欄(大多數瀏覽器中的F12)檢查DOM,Url是不包含任何參數還是包含空值? – Tx3 2012-07-22 17:32:52