System.InvalidCastException迭代Viewdata

时间:2011-01-19 09:42:07

标签: html asp.net-mvc drop-down-menu html-helper

System.InvalidCastException迭代Viewdata

我需要替换代码

"<%=Html.DropDownList("Part", (SelectList)ViewData["Parts"])%>

由于某种原因以下列方式下拉。

 <select> <% foreach (Hexsolve.Data.BusinessObjects.HSPartList item in (IEnumerable<Hexsolve.Data.BusinessObjects.HSPartList>)ViewData["Parts"])
               { %>
            <option value="<%=item.Id %>">
                <%=item.PartName %>
                &nbsp;&nbsp;&nbsp;
                <%=item.IssueNo %></option>
            <% } %>
        </select>

我收到将SelectedList转换为IEnumerable的错误

错误:无法将类型为“System.Web.Mvc.SelectList”的对象强制转换为“System.Collections.Generic.IEnumerable`1 [Hexsolve.Data.BusinessObjects.HSPartList]”。

这是迭代viewdata []的正确方法吗?请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

抱歉,我之前的回答不正确。

我认为问题在于GetEnumerator会返回IEnumerator<SelectListItem>,而不是您要访问的IEnumerator<Hexsolve.Data.BusinessObjects.HSPartList>

我建议以下内容应该有效:

<% foreach (SelectListItem item in (SelectList)ViewData["Parts"])
{ %>
    <option value="<%= item.Value %>"><%= item.Text %></option>
<% } %>

如果您需要在PartName属性中连接IssueNoText,您可以在构建选择列表时执行此操作。

所以你最终会得到类似的东西:

 public class Part
 {
     public int Id { get; set; }
     public int IssueNo { get; set; }
     public string PartName { get; set; }
 }

   var parts = new List<Part>{
             new Part { Id = 1, IssueNo = 1, PartName = "Spanner" },
             new Part { Id = 2, IssueNo = 1, PartName = "Hammer" }
         };

   var selectList = new SelectList(
         parts.Select(p => 
                new { Id = p.Id, 
                      Name = p.PartName + " " + p.IssueNo.ToString()}),
         "Id",
         "Name");

   foreach (var item in selectList)
   {
       Console.WriteLine(item.Value);
       Console.WriteLine(item.Text);
   }

   /* 
   Output:
   1
   Hammer 1
   2
   Spanner 1
   */

希望有所帮助!