【问题标题】:List<string> passed in ViewBag gets spoiled with "System.Collections.Generic.List`1[System.String]"在 ViewBag 中传递的 List<string> 被“System.Collections.Generic.List`1[System.String]”破坏
【发布时间】:2013-07-04 11:58:03
【问题描述】:

我想我有一个非常菜鸟的问题,但确实是这样:

我有一个到另一个控制器的链接,我想传递一个字符串列表。

控制器:

[HttpPost]
public ActionResult Index(DateTime? dateFilter, int? Provider, int? middleOffice)
{
...
ViewBag.ReasonGroupName = new List<string>() { "Faults" };
...
}

查看:

@Html.ActionLink(item.username, "Edit", "Hours", new { IdUser = item.IdUser, ReasonGroupNames = (List<string>)ViewBag.ReasonGroupName }, new { @class = "iframeFull" })

在我的控制器中,ViewBag.ReasonGroupName 已正确创建:索引为 0 项 ([0]) 的列表带有字符串 "Faults",但当我在其他控制器中收到它时,列表的 0 索引元素附带"System.Collections.Generic.List1[System.String]" 而不是 "Faults"

我也尝试将ViewBag 更改为ViewData 对象,但出现了同样的问题。

对我做错了什么有任何想法吗?

谢谢

【问题讨论】:

  • 另一个控制器得到一个列表,它在索引 0 处有一个字符串值 "System.Collections.Generic.List1[System.String]"?或者也许另一个控制器有一个列表,在第 0 个元素中有另一个列表?我认为您也应该向我们展示另一个控制器的代码。
  • 编辑操作是什么样的?
  • 编辑动作很简单:public ActionResult Edit(long IdUser, List&lt;string&gt; ReasonGroupNames) { var table = LoadEdit(IdUser, ReasonGroupNames); return View(table);}

标签: c# asp.net-mvc asp.net-mvc-3


【解决方案1】:

文本“System.Collections.Generic.List1[System.String]”是在 List 类型的实例上调用 ToString() 时得到的。生成链接时,url 必须是字符串,因此每个参数都会调用 ToString()。

不清楚您试图通过操作链接发送什么信息。如果您想要第一个值,则可以将链接更改为以下内容:

@Html.ActionLink(item.username, "Edit", "Hours", new { IdUser = item.IdUser, ReasonGroupNames = ((List<string>)ViewBag.ReasonGroupName)[0] }, new { @class = "iframeFull" })

这会将ReasonGroupName 设置为列表中的第一个值。

但您可能希望发送列表中的所有值,而不仅仅是第一个。在这种情况下,您可以将列表的所有值连接成一个字符串,然后将其作为参数传递。

所以在你的控制器中你可以这样做:

ViewBag.ReasonGroupName = string.Join(",", yourListVariableHere);

这会将列表转换为可以正确包含在 url 中的逗号分隔字符串。

【讨论】:

  • 就我而言,第一个值就足够了,但我试图传递一个列表,因为我试图以更通用的方式进行。无论如何,你的回答让我明白发生了什么;)
【解决方案2】:

@Html.ActionLink() 方法用于生成指向给定控制器/操作的 url 链接。因此,它只能包含可以在链接的 url 中传递的参数。

所以我认为你不能通过 url 传递对象。

【讨论】:

    【解决方案3】:

    您正试图通过 get-request 发送一些复杂的数据。首先,无论如何这都是个坏主意,因为在一个好的时刻你可以克服链接的限制。

    你有解决方案:

    1. 继续发送 get-request:将列表序列化为字符串 - 使用特殊序列化程序或使用 string.Join(",", list);您的编辑方法必须接受字符串,您可以通过特殊的反序列化器或 string.Split 方法将其反序列化为 List。如果您的字符串可以包含 char ','

    2. ,则使用 string.Joinstring.Split 是个坏主意
    3. 不发送数据。您可以将其存储在 db/session 中,然后发送已保存数据的 id。您必须准确:您必须从 db/session 中删除旧数据,而不是新数据

    4. 使用后请求。用@Html.BeginForm(...)制作表格;在带有for 的表单中添加隐藏输入(@Html.HiddenFor(...)),并添加提交按钮&lt;input type="submit"&gt;,将其设置为链接。

    【讨论】:

      【解决方案4】:

      您的问题是由于您尝试传递字符串列表但已将其分配给ActionLink() 中的字符串属性。您需要创建一个小助手来将此列表分解为您选择的单个格式化字符串。然后,这将作为(例如)逗号分隔的字符串传递给 url。然后,您将在控制器操作中执行一些魔术,以根据需要将其重新水化回列表。

      【讨论】:

      • 很遗憾 MVC4 没有帮助器来生成带有集合路由值的 URL。我在 CodePlex 上提出了这个问题,但它被关闭为“无法修复”:aspnetwebstack.codeplex.com/workitem/636
      • 我猜“不会修复”可能表示“风向改变”:) 但同意,一个有用的补充待定..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多