我有一个视图,我将viewmodel对象传递给包含IQueryable <>对象的对象 .
此对象用于填充mvccontrib网格 . 该视图还包含其他部分视图,允许用户过滤网格中的数据 .
一旦网格被过滤,我希望用户能够将Iqueryable对象导出到另一个控制器actionresult方法,然后调用另一个将数据导出到Excel的viewmodel .
以下是调用Export actionresult()方法的视图片段:
@using (Html.BeginForm("Export", "Home", FormMethod.Post, new { Model }))
{
<p>
<input class="button" value="Export to Excel" type="submit" />
</p>
}
Model确实包含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 }
. 这本来很容易:-) . 你必须逐个发送它们:显然这可能会非常痛苦 . 所以我建议你只发送一个id:
然后在您的控制器内部应该导出到Excel的操作使用此ID来从最初在GET操作中获取它的任何地方获取对象(可能是数据库或其他东西) . 如果您想保留分页以及用户可以在网格上执行的操作,您也可以将它们发送到服务器:
另一种可能性(我不推荐)包括将此对象保存到会话中,以便您以后可以将其取回 .
另一种可能性(我仍然不建议)是使用MVCContrib的Html.Serialize助手,它允许您将整个对象图序列化为隐藏字段,并在表单提交时将其发送到服务器,您将能够将其作为动作参数获取 .
简单的答案是:不要将IQueryable属性放在模型中 . 该模型应该是纯粹的简单对象和验证属性 . 保持控制器中的可查询性 .