在控制器mvc中迭代IEnumerable ViewData
本文关键字:IEnumerable ViewData 迭代 控制器 mvc | 更新日期: 2023-09-27 18:07:55
我试图在ViewData["element"]上foreach循环,以便建立一个数组
错误读取不能完全将对象转换为字符串[]
foreach(var p in (IEnumerable<string>)ViewData["element"] as Array)
{
string[] workbookIDsLinks = p;
}
查看数据来自
ViewData["element"] = names.Cast<XmlNode>().Select(e => e.Attributes["id"].Value);
任何帮助都会很棒
From MSDN:
如果将数组强制转换为array类型,则结果是对象,而不是数组
所以,你已经得到了一个对象引用,即使你明确地要求一个Array
!
与其将IEnumerable<string>
(或IEnumerable<anything>
)存储在ViewData
中,不如在存储之前将其转换为数组或列表,在赋值结束时添加ToList()
。这样在另一端处理起来就容易多了。
在你的情况下,我不确定names
的类型,所以我不确定你需要做什么来把你的结果变成string
的列表。
- 不要在这里使用
IEnumerable<string>
,因为它可以延迟执行(您可以搜索Deferred execution以了解更多信息),并且数据源在此时可能无效(DB连接关闭,XML文件关闭等)。相反,使用ToArray()
来具体化你的收藏。 - 没有必要做
foreach
,因为元素已经是元素的集合了;
在你的控制器中:
ViewData["element"] = names
.Cast<XmlNode>()
.Select(e => e.Attributes["id"].Value)
.ToArray();
在你看来:
var workbookIDsLinks = ViewData["element"] as string[];
尝试使用
ViewData["element"] = sitenames
.Cast<XmlNode>()
.Select(e => new KeyValuePair<string,string>(e.Attributes["id"].Value, e.Attributes["name"].Value));