2011-09-21 75 views
1

我有一個視圖,我將一個viewmodel對象傳遞給包含IQueryable對象的視圖模型對象。MVC3通過Iquableable將viewmodel對象傳遞迴控制器

此對象用於填充mvccontrib網格。該視圖還包含允許用戶過濾網格內數據的其他部分視圖。

網格過濾後,我希望用戶能夠將Iqueryable對象導出到另一個控制器actionresult方法,然後調用另一個將數據導出到Excel的視圖模型。

這裏是調用導出的ActionResult()方法的視圖的片段:

@using (Html.BeginForm("Export", "Home", FormMethod.Post, new { Model })) 
{ 
    <p> 
    <input class="button" value="Export to Excel" type="submit" /> 
    </p> 

}

模型確實包含的IQueryable對象。

當我調試代碼時,我可以查看viewmodel對象,當然爲了填充IQueryable我必須枚舉該對象。

我還創建了另一個viewmodel對象,一旦Model對象傳回給actionresult方法,就會嘗試使用.ToList()方法或AsEnumerable()方法枚舉IQueryable對象。

但在所有情況下,IQueryable對象都作爲空對象傳遞給控制器​​。

這裏是正在從視圖稱爲動作結果方法:

[HttpPost] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Export(PagedViewModel<NPSProcessed> NPSData) 
{ 
    string message = ""; 
    NPSData Query = new Models.NPSData(NPSData); 

    Query.IData = NPSData.Query.ToList(); 

     // Opening the Excel template... 
     FileStream fs = 
     new FileStream(Server.MapPath(@"\Content\NPSProcessedTemplate.xls"),   FileMode.Open, FileAccess.Read); 

     MemoryStream ms = new MemoryStream(); 

     ee.ExportData(fs, ms, Query.IData, message); 

     // Sending the server processed data back to the user computer... 
     return File(ms.ToArray(), "application/vnd.ms-excel", "NPSProcessedNewFile.xls"); 

    } 

任何援助將不勝感激。

感謝

回答

2

你不能來回傳遞複雜的對象是這樣的:new { Model }。這本來很容易:-)。你將不得不一一發送它們:

new { prop1 = Model.Prop1, prop2 = Model.Prop2, ... } 

很明顯,這可能會變得非常痛苦。因此,我建議你的是隻發送一個id:

new { id = Model.id } 

,然後是應該導出到Excel中使用這個ID來從對象無論你在GET行動最初取來你的控制器動作內(大概是一個數據庫或其他東西)。如果您希望保留用戶可能已經對電網進行分頁,之類的東西,你可以把他們也給服務器:

new { id = Model.id, page = Model.CurrentPage, sortColumn = Model.SortBy } 

另一種可能(我不推薦)由成儲蓄將此對象放入會話中,以便稍後可以取回它。

另一種可能性(我仍然不推薦)是使用MVCContrib的Html.Serialize幫助程序,它允許您將整個對象圖形序列化爲隱藏字段,並在表單處於發送狀態時發送給服務器提交後,您將能夠將其作爲動作參數獲取。

+0

好的答案,我已經嘗試過新的{prop1 = Model.Query}。 Model.Query是IQueryable對象。我收到以下錯誤:無法創建接口的實例。 –

+0

@Joe Pitz,不,只有簡單的類型(字符串,整數,...)。不要嘗試發送任何複雜的對象。它不會工作。 –

+0

如果用戶選擇幾百行,那麼將這些數據傳回模型的最佳方法是什麼?傳遞用戶選擇的過濾器參數,然後使用Export模型中的這些參數重新創建數據表上的過濾器條件是最好的方法嗎?謝謝 –

1

簡單的答案是:不要把IQueryable屬性放在你的模型中。該模型應該是純粹簡單的對象和驗證屬性。保持控制器的可查詢性。

+0

那麼我如何將數據表中的數據傳遞給mvccontrib網格? IQueryable的遲到,據我所知,允許分頁發生在網格中?你會推薦什麼樣的解決方案來從模型或控制器中獲取數據並重新獲取數據? –

+0

保持簡單;將數據作爲IList <>對象發送,將更改存儲在簡單的JSON字符串中,以便通過AJAX進行持久性或更新。根據我的經驗,MvcContrib網格比您想要做某些事情甚至稍微定製時的價值更加痛苦。 (個人意見) –

+0

要清楚:隨意發送收藏到視圖;不要試圖從視圖中恢復。 –

相關問題