2011-09-21 73 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

要清楚:随意发送收藏到视图;不要试图从视图中恢复。 –

相关问题