在控制器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);

任何帮助都会很棒

在控制器mvc中迭代IEnumerable ViewData

From MSDN:

如果将数组强制转换为array类型,则结果是对象,而不是数组

所以,你已经得到了一个对象引用,即使你明确地要求一个Array !

与其将IEnumerable<string>(或IEnumerable<anything>)存储在ViewData中,不如在存储之前将其转换为数组或列表,在赋值结束时添加ToList()。这样在另一端处理起来就容易多了。

在你的情况下,我不确定names的类型,所以我不确定你需要做什么来把你的结果变成string的列表。

  1. 不要在这里使用IEnumerable<string>,因为它可以延迟执行(您可以搜索Deferred execution以了解更多信息),并且数据源在此时可能无效(DB连接关闭,XML文件关闭等)。相反,使用ToArray()来具体化你的收藏。
  2. 没有必要做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));