列表<;字符串>;在ViewBag中传递的信息被“;System.Collections.Generic.Lis

本文关键字:信息 System Generic Lis Collections gt 字符串 lt ViewBag 列表 | 更新日期: 2023-09-27 18:21:05

我想我有一个很小的问题,但它是:

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

控制器:

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

你知道我做错了什么吗?

感谢

列表<;字符串>;在ViewBag中传递的信息被“;System.Collections.Generic.Lis

如果对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中。

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

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

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

您有解决方案:

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

  2. 不要发送数据。您可以将其存储在数据库/会话中,然后发送已保存数据的id。你必须准确:你必须从数据库/会话中删除旧数据,但不能从中删除新数据

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

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

相关文章: