2011-01-19 45 views
1

System.InvalidCastException迭代通过可视数据System.InvalidCastException通过可视数据

迭代我需要更换代码

"<%=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 []的正确方法。请帮我解决这个问题。

+2

如果您还有其他问题,请将其添加为注释或创建一个新问题。你已经完全改变了你的问题,这意味着我现在的回答并没有丝毫意义。我已经给你一个彻底的答案。如果你不想使用它,那么很好,但不要改变这个问题。 – fearofawhackplanet 2011-01-19 13:01:00

+0

对不起,我会换qst到老qst。 – 2011-01-20 06:31:03

回答

0

对不起,我以前的答案是不正确的。

我相信问题是GetEnumerator返回IEnumerator<SelectListItem>,而不是IEnumerator<Hexsolve.Data.BusinessObjects.HSPartList>您试图访问。

我建议像下面应该工作:

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

如果您需要连接PartNameIssueNoText属性,它看起来就像你正在试图做的,你能做到这一点,同时建立选择列表。

所以,你可能最终的东西,如:

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 
    */ 

希望帮助!