我认为我有一个非常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
对象,但会出现同样的问题。
关于我做错的任何想法?
由于
答案 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发送一些复杂数据。首先,无论如何,这是个坏主意,因为在一个好的时刻,你可以克服链接的限制。
你有解决方案:
继续发送get-request:serialize list to string - 使用特殊序列化器或使用string.Join(",", list)
;您的编辑方法必须接受字符串,您可以通过特殊反序列化程序或string.Split
方法将其反序列化为List。如果您的字符串可以包含字符“string.Join
”
string.Split
和,
是不明智的。
不发送数据。您可以将其存储在db / session中,然后发送已保存数据的id。您必须准确:您必须从db / session中删除旧数据,但不能删除新数据
使用post-request。使用@Html.BeginForm(...)
制作表单;在for
添加隐藏输入(@Html.HiddenFor(...)
)的表单中,添加提交按钮<input type="submit">
,将其设置为链接。
答案 3 :(得分:0)
您的问题是由于您尝试传递字符串列表但已将其分配给ActionLink()
中的字符串属性。您需要创建一个小帮助程序,将此List分解为您选择的单个格式化字符串。然后,它将作为(例如)逗号分隔的字符串传递给url。然后,您可以在控制器操作中做一些魔术,根据需要将其重新水化回List。