2013-07-04 21 views
1

我想我有一個很小白的問題,但它就在那裏撒嬌控制器,我想傳遞一個字符串列表。列表<string>獲取與「System.Collections.Generic.List`1 [System.String]」

控制器:

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

I也嘗試更改ViewBagViewData對象,但出現同樣的問題。

任何意見我做錯了什麼?

感謝

+0

另一個控制器得到一個索引爲0的列表有一個String值'「System.Collections.Generic.List1 [System.String]」'?或者也許另一個控制器得到一個列表,在第0個元素裏面有另一個列表?我想你也應該向我們展示其他控制器的代碼。 – quetzalcoatl

+2

「編輯」操作的外觀如何? –

+0

編輯操作非常簡單:'public ActionResult Edit(long IdUser,List ReasonGroupNames){var table = LoadEdit(IdUser,ReasonGroupNames);返回查看(表);}' –

回答

1

文本「System.Collections.Generic.List1 [System.String]」是,如果你在列表類型的實例調用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中的逗號分隔字符串。

+0

對於我的情況,第一個值是足夠的,但我試圖通過一個列表,因爲我試圖以更通用的方式做。無論如何,你的回答讓我明白髮生了什麼;) –

0

你的問題是由於這樣的事實,你想傳遞一個字符串列表,但它已經在ActionLink()分配給一個字符串屬性。您需要創建一個小助手來將此列表分解爲您選擇的單個格式化字符串。這將作爲(例如)逗號分隔的字符串傳遞給url。然後,您會在控制器操作中做一些魔術,以根據需要將其重新水化回列表。

+0

這是一個可惜的MVC4沒有助手生成具有收集路徑值的URL。我在CodePlex上提出這個問題,但它被封閉爲「不會修復」:https://aspnetwebstack.codeplex.com/workitem/636 – Joe

+0

我想「不會修復」可能表明,「方向改變風「:)但同意,一個有用的補充待定.. –

1

時,使用@Html.ActionLink()方法生成的URL鏈接到給定的控制器/動作。因此,它只能包含可以在鏈接的url中傳遞的參數。

所以我不認爲你可以在URL上傳遞一個對象。

1

您試圖通過GET請求發送一些複雜的數據。首先,這是一個壞主意,因爲在一個良好的時刻,你可以克服鏈接的限制。

你有解決方案:

  1. 留在發送獲取請求:序列化列表的字符串 - 使用特殊的串行或使用string.Join(",", list);您的編輯方法必須接受字符串,您可以通過特殊的反序列化器或通過方法將其反序列化爲列表。使用string.Joinstring.Split是壞主意,如果您的字符串可以包含字符','

  2. 不發送數據。您可以將其存儲在db/session中,然後發送已保存數據的ID。您必須準確:您必須從db/session刪除舊數據,但不能刪除新數據

  3. 使用後請求。用@Html.BeginForm(...)製作表格;以for的形式添加隱藏的輸入(@Html.HiddenFor(...)),並添加提交按鈕<input type="submit">,將其作爲鏈接樣式。

相關問題