【问题标题】:How to pass List of objects from view to controller action in asp.net mvc3如何在asp.net mvc3中将对象列表从视图传递到控制器操作
【发布时间】:2011-06-04 13:53:23
【问题描述】:

我进行了综合搜索,可返回多个对象列表。每个这样的列表都由包含附加列表的对象组成。就处理器负载而言,搜索非常复杂。

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

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

         return PartialView("_searchResult", linije);
       }

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

  @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);
    }

在该控制器操作中,我得到空列表。 你能告诉我如何做到这一点。

>

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

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

如果不可能,是否可以通过 AJAX 呈现部分视图,但无需控制器操作?

【问题讨论】:

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


    【解决方案1】:

    您似乎应该在 For 循环之外定义您的列表,然后在循环中添加它。否则,您将每次都定义一个新列表,并且只能从最后一次遍历中获取列表的外观,因为它可能什么都没有,因此您的列表是空的。

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

    【讨论】:

    • 我的视图模型中有完整的列表,问题是,我不知道如何将它传递回控制器。我可以毫无问题地将它传递给我的部分观点。但我需要将它传递回控制器,这样我就可以使用 AJAX 渲染部分视图。
    • 我会把它作为 JSON 传递给任何控制器来为你的 AJAX 响应生成内容。
    【解决方案2】:

    我目前对这个问题的解决方案是把数据临时持久化到Session中。

            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可以提供更好的解决方案,请提供。

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      相关资源
      最近更新 更多