2

我想我有一个非常菜鸟的问题,但它是:

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

控制器:

[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"

我也尝试更改对象ViewBagViewData但出现同样的问题。

关于我做错了什么的任何想法?

谢谢

4

4 回答 4

2

如果您在 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 中的逗号分隔字符串。

于 2013-07-04T12:08:58.390 回答
1

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

所以我不认为你可以通过 url 传递一个对象。

于 2013-07-04T12:03:41.547 回答
1

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

你有解决方案:

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

  2. 不要发送数据。您可以将其存储在 db/session 中,然后发送已保存数据的 id。您必须准确:您必须从 db/session 中删除旧数据,而不是新数据

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

于 2013-07-04T12:10:25.053 回答
0

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

于 2013-07-04T12:03:06.820 回答