首页 文章

MVC3将具有Iqueryable的viewmodel对象传递回Controller

提问于
浏览
1

我有一个视图,我将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 回答

  • 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

    简单的答案是:不要将IQueryable属性放在模型中 . 该模型应该是纯粹的简单对象和验证属性 . 保持控制器中的可查询性 .

相关问题