如何在asp.net mvc3中将对象列表从视图传递到控制器操作

时间:2011-06-02 12:08:52

标签: asp.net-mvc asp.net-mvc-3 viewdata

我有全面的搜索功能,可以返回多个对象列表。每个这样的列表由包含附加列表的对象组成。在处理器负载方面,搜索非常复杂。

获得结果后,我会通过局部视图显示原始对象。

  public ActionResult BeginSearch(SearchHomeVM searchParameters)
      {
         var search = new Search(searchParameters);
         linije = search.PretraziLinije();

         return PartialView("_searchResult", linije);
       }

然后以该形式我希望通过AJAX调用显示特定项目的详细信息。问题是我需要使用对象数据,而不是在数据库中运行另一个搜索。 在razor我有:

  @model LinijeSearchResult
  @if (Model.BrojDirektnihLinija > 0)
  {
  <table id="direktneLinije" class="InvisibleTable">
    <thead>
        <tr>
            <th>
                Direktne linije
            </th>
            <th>
            </th>
        </tr>
    </thead>
    @for (int index = 0; index < Model.DirektneLinije.Count; index++)
    {
        LinijaSM item = Model.DirektneLinije[index];
        List<LinijaSM> lin = new List<LinijaSM> { item };
        <tr>
            <td>@item.Naziv
            </td>
            <td>
                @using (Ajax.BeginForm("RenderStanice",
                    new { psd = 0, index = index, lin = lin },
                    new AjaxOptions
                    {
                        HttpMethod = "POST",
                        UpdateTargetId = "staniceLinije",
                        InsertionMode = InsertionMode.Replace
                    }))
                {
                    <input type="submit" value="Stanice" />
                }
            </td>
        </tr>
    }
   </table>

   }
   else
   {
    <text>Nema direktnih linija za odabrane parametre.</text>
    <br />
   }

在这里您可以看到我如何尝试将数据传递给控制器​​操作,如下所示:

    public ActionResult RenderStanice(List<LinijaSM> lin)
    {
        return PartialView("_staniceSR", lin);
    }

在那个控制器动作中我得到空列表。 你可以告诉你如何做到这一点。

&LT;&LT;编辑&gt;&gt;

到目前为止,我已经想通了,任何对象的List都无法传递回控制器。复杂的对象也是如此。我可以传递一个整数,但不能传递整数列表。

有人可以告诉我如何实现目标吗? 我需要将一个对象列表传递回控制器。可以通过将其添加到上下文,创建新的viewData或类似的东西来完成吗?

如果那是不可能的,可以通过AJAX渲染局部视图,但没有控制器动作吗?

2 个答案:

答案 0 :(得分:2)

看起来您可能应该在For循环之外定义列表,然后在循环中添加它。否则,你每次都会定义一个新的列表,并且只能获得从最后一次传递到列表的内容,因为它可能是空的,因此是你的空列表。

更新:但是......更重要的是,您应该在将控制器传递到局部视图之前在控制器中构建一个视图就绪对象。使用Razor在视图中创建该对象并不是非常好的关注点分离。创建一个视图模型以发送到包含该列表的完整视图,然后将该列表传递给局部视图。

答案 1 :(得分:0)

我目前解决此问题的方法是暂时将数据保存在会话中。

        linije = search.PretraziLinije();
        Session["direktneLinije"] = linije.DirektneLinije;
        Session["jednoPresjedanjeLinije"] = linije.LinijeUzJednoPresjedanje;
        Session["dvaPresjedanjaLinije"] = linije.DirektneLinije;

并仅来回传递字段的索引以访问相应的数据。

    @for (int index = 0; index < Model.DirektneLinije.Count; index++)
    {
        LinijaSM item = Model.DirektneLinije[index];
        <tr>
            <td>@item.Naziv
            </td>
            <td>
                @using (Ajax.BeginForm("RenderStanice",
                    new { index, bpr = 0 },
                    new AjaxOptions
                    {
                        HttpMethod = "POST",
                        UpdateTargetId = "staniceLinije",
                        InsertionMode = InsertionMode.Replace
                    }))
                {

                    <input type="submit" value="Stanice" />
                }
            </td>
        </tr>
    }

我不确定这是一个非常好的方法,但由于它是一个相当少量的数据,可以被访问几次然后变得无关紧要,再次计算或将其保存在数据库中会更加昂贵

如果any1可以提供更好的解决方案,请执行。