2011-01-19 65 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 
    */ 

希望幫助!