我有一个视图,我将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>
}
模型确实包含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");
}
非常感谢任何协助。
由于
乔
答案 0 :(得分: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助手,它允许您将整个对象图序列化为隐藏字段,并在提交表单时将其发送到服务器并且您将能够将其作为动作参数获取。
答案 1 :(得分:1)
简单的答案是:不要将IQueryable属性放在模型中。该模型应该是纯粹的简单对象和验证属性。保持控制器的可查询性。