在ViewBag中传递的List <string>会被&#34; System.Collections.Generic.List`1 [System.String]&#34; </string>破坏

时间:2013-07-04 11:58:04

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

我认为我有一个非常noob的问题,但它是:

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

控制器:

[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对象,但会出现同样的问题。

关于我做错的任何想法?

由于

4 个答案:

答案 0 :(得分:1)

使用@Html.ActionLink()方法生成指定Controller / Action的url链接。因此,它只能包含可以在链接的URL中传递的参数。

所以我认为你不能在网址上传递一个对象。

答案 1 :(得分:1)

如果在List类型的实例上调用ToString(),则会显示“System.Collections.Generic.List1 [System.String]”文本。当你生成链接时,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 :(得分:1)

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

你有解决方案:

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

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

  4. 使用post-request。使用@Html.BeginForm(...)制作表单;在for添加隐藏输入(@Html.HiddenFor(...))的表单中,添加提交按钮<input type="submit">,将其设置为链接。

答案 3 :(得分:0)

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