2016-11-04 3 views
0

別の目が必要です。エラーは次のとおりです。MVC DropDownListFor問題のキー

The ViewData item that has the key 'BrandId' is of type 'System.Int32' 
but must be of type IEnumerable<SelectListItem>. 

HTML

@Html.DropDownListFor(x => x.BrandId, Model.BrandForDropDown, "- Brand -") 

コントローラ

model.BrandForDropDown = Repository.GetBrandsForDropDown(); 

public SelectList GetBrandsForDropDown() 
    { 
     if (Membership.GetUser() != null) 
     { 
      return new SelectList((from store in DataContext.Stores 
          join userstore in DataContext.UserStores on store.StoreId equals userstore.StoreId 
          join brand in DataContext.Brands on store.BrandID equals brand.BrandID 
          where userstore.UserId == userId 
          select new SelectListItem 
          { 
           Value = brand.BrandID.ToString(), 
           Text = brand.BrandName 
          }).OrderBy(x => x.Text)); 
     } 

     return new SelectList(new List<Brand>()); 
    } 

モデル

public int BrandId { get; set; } 
public SelectList BrandForDropDown { get; set; } 
..others omitted 

私もList<SelectListItem>をモデルとビューなどで試してみました。同じエラー

+0

同じビューを返すポストバック後にエラーが発生しますか? – Izzy

+0

@Izzy noこれは初期の表示負荷です –

+0

'SelectList'にデータがない場合にも同じエラーメッセージが表示される可能性があります – Izzy

答えて

1

あなたのコードには1つの問題があります。選択リストの作成時にdataValueFieldとdataTextFieldを指定する必要があります。したがって、サーバーメソッドで、またはビューで使用する場合は、どちらかを行う必要があります。あなたの方法で

select new SelectListItem 
         { 
         Value = brand.BrandID.ToString(), 
         Text = brand.BrandName 
         }).OrderBy(x => x.Text),"Value","Text"); 

別のオプションは、単にList<SelectListItem>にプロパティの種類を変更し、その型を返すためにあなたの方法を更新することであることをどのように行う

はこれがあります。あなたの場合は条件が

public List<SelectListItem>GetBrandsForDropDown() 
{ 
    if(Membership.GetUser() != null) 
    { 
    // your existing code 
       select new SelectListItem 
       { 
         Value = brand.BrandID.ToString(), 
         Text = brand.BrandName 
       }).OrderBy(x => x.Text)); 
    } 
    return new List<SelectListItem(); 
} 

を失敗したときに

public int BrandId { get; set; } 
public List<SelectListItem> BrandForDropDown { get; set; } 

これは

1

は私のトリックに従ってください動作するはずです、あなたが同じ型を返すことを確認してください。

コントローラ

ViewBag.BrandForDropDown = Repository.GetBrandsForDropDown(); 

HTML

@Html.DropDownListFor(x => x.BrandId, ViewBag.BrandForDropDown as 
List<SelectListItem>, "- Brand -") 

感謝。