【问题标题】:Passing List<T> from View to Controller将 List<T> 从视图传递到控制器
【发布时间】:2014-08-23 12:36:32
【问题描述】:

我遇到了一个问题,将 T 类型的列表从视图传递回控制器,该控制器在部分视图中加载列表以在模式对话框中显示它们。

这是我所拥有的:

视图传递给控制器​​:

@foreach(var queue in itemQueues)
{
    <td>@Html.ActionLink(queues.OpenItems.Count.ToString(), "ItemQueueDetails", "Pod", new { collection = queue.OpenItems }, null)</td>
}

控制器传递给局部视图:

public ActionResult ItemQueueDetails(List<Item> collection)
{
    var cols = typeof(Incident).GetProperties();
    ViewData["DataHeaders"] = cols;
    ViewData["DataRows"] = collection;

    return PartialView("QueueDetails");
}

局部视图符合您的预期,所以我现在认为它并不相关。

唯一的问题是,无论有多少元素存储在作为参数传递给 ItemQueueDetails ActionResult 的队列列表中,collection 参数总是以零元素列表结束。

我的应用程序只显示数据。初始视图仅显示队列计数(尽管它传递了整个列表并仅显示计数),而单击 # of items 应该显示显示实际详细信息的模式。

【问题讨论】:

  • 您是否尝试改用ViewBag
  • @abatishchev 我的理解是 ViewBag 允许将数据从控制器传递到视图,而不是相反。我需要将我的列表从视图传递给控制器​​。
  • 视图不应该首先以这种方式将任何内容发送回控制器。尝试重新思考/重新设计。
  • 也尝试添加另一个局部视图,不要重复使用第一个。
  • 既然您在渲染主视图时已经有了数据,那么您是否有理由不只是在主视图中包含详细信息(可能在隐藏元素中并切换其可见性)?

标签: c# asp.net-mvc


【解决方案1】:

尝试使用 ViewbagViewDataTempData 并将列表放入其中,然后在控制器操作中再次将其放入 ViewData["DataRows"] 或尝试类似的操作:-

 @foreach(var queue in itemQueues)
  {
     <td>
        @Html.ActionLink(queues.OpenItems.Count.ToString(), "ItemQueueDetails",
        "Pod", new RouteValueDictionary{
        { "collection[0]", queue.OpenItems[0] },
        { "collection[1]", queue.OpenItems[1] }
        })
     </td>
  }

【讨论】:

  • 是的。换句话说,你搞砸了。 MVC.net 不是为传递对象而设计的,因为 HTTP 不是为传递对象而设计的。最多它传递字符串,然后服务器端将其解释为对象的属性。或字符串的集合,然后可以将其解释为集合的属性。但这只是简单的丑陋编程。
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多