迭代控制器mvc 5中的IEnumerable ViewData

时间:2015-08-13 09:32:21

标签: c# asp.net-mvc

我试图在ViewData [“element”]上循环以构建一个 数组

错误读取无法将对象转换为字符串[]

        foreach(var p in (IEnumerable<string>)ViewData["element"] as Array)
        {
            string[] workbookIDsLinks = p;
        }

vuiewdat来自

ViewData["element"] = names.Cast<XmlNode>().Select(e => e.Attributes["id"].Value);

任何帮助都会很棒

3 个答案:

答案 0 :(得分:1)

来自MSDN

  

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

所以,你有一个对象引用,即使你明确要求Array

不是将IEnumerable<string>(或IEnumerable<anything>)存储在ViewData中,只需在存储之前转换为数组或列表,方法是在结尾处添加ToList()。你的任务。然后你可以更容易地在另一端处理它。

在您的情况下,我不确定names的类型,因此我不确定您需要做什么才能将结果转换为string列表。

答案 1 :(得分:0)

  1. 不要在这里使用IEnumerable<string>,因为它可能会被懒惰地执行(您可以搜索延迟执行以了解更多信息),此时数据源可能无效(数据库连接)关闭,XML文件关闭等)。而是使用ToArray()来实现您的碰撞。
  2. 没有必要做foreach,因为元素已经是元素的集合;
  3. 在您的控制器中:

    ViewData["element"] = names
        .Cast<XmlNode>()
        .Select(e => e.Attributes["id"].Value)
        .ToArray();
    

    在您看来:

    var workbookIDsLinks = ViewData["element"] as string[];
    

答案 2 :(得分:0)

尝试使用

ViewData["element"] = sitenames
    .Cast<XmlNode>()
    .Select(e => new KeyValuePair<string,string>(e.Attributes["id"].Value, e.Attributes["name"].Value));