2017-07-21 10 views
1

これは、私がdropdownlistを作成してhtml要素を作成する方法です。ドロップダウンリストのselectlistitemの値をモデルの文字列プロパティにバインドする方法

AccountController:

 public ActionResult Index() 
     { 
      ViewBag.Towns = new SelectList(_skrsService.GetTowns(), "Value", "Text", 1); 
      return View(); 
     } 
... 

public List<SelectListItem> GetTowns() 
     { 
      var list = UnitOfWork.Repository<SkrsIl>().OrderBy(x => x.Adi).Select(x => new SelectListItem() 
      { 
       Text = x.Adi, 
       Value = x.Kodu.ToString() 
      }).ToList(); 
      return list; 
     } 

Login.cshtml(出身地は、ビュー・ページにログインするbindnedモデル内の文字列フィールドです):

@Html.DropDownListFor(x => x.Hometown, ((SelectList)ViewBag.Towns), new { @class = "form-control", placeholder = "Doğum Yeri" }) 

私はこれが動作するように期待されるが、エラーを取得し、メッセージ:

"キーが 'Hometown'であるViewDataアイテムは、タイプが である必要があります。 'IEnumerable < SelectListItem>'を入力してください。

どうすれば正常に動作させることができますか?私はちょうど '故郷'のプロパティのselectem項目の値を期待しています

+1

これは、 'viewBag.Towns'の値が' null'であることを意味します - [この回答]を参照してください(https://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key -xxx-of-of-type-system-int32-but-must-be-o)を使用します。また、 'new SelectList()'を使用することは無意味な余分なオーバーヘッドです - 同じIEnumerable を作成し、コンストラクタの4番目のパラメータは無視されます - 選択されたものを決定する 'Hometown'の値 –

+0

こんにちは、あなたのコメントには私が必要以上にたくさん含まれています。 – TyForHelpDude

答えて

1

このエラーは、ViewBag.Townsnullであることを意味します。 2番目のパラメータ(IEnumerable<SelectListItem> selectList)がnullの場合、メソッドは最初のパラメータがIEnumerable<SelectListItem>の型であると予測します。

これはGETメソッドで割り当てられているため、フォームを送信してビューを返しても、GETメソッドの場合と同じようにViewBag.Townsの値が再投入されていない場合はほぼ確実に発生します。

補足として、new SelectList()を使用するのは無意味な余分なオーバーヘッドです。最初のものに基づいて別のIEnumerable<SelectListItem>が作成されます。さらに、SelectListコンストラクタの4番目のパラメータは、モデルプロパティにバインドするときは無視されます。内部的には、このメソッドは新しいIEnumerable<SelectListItem>を作成し、バインドするプロパティの値に基づいてSelectedプロパティを設定します。

お使いのコントローラのコードは

public ActionResult Index() 
{ 
    ViewBag.Towns = _skrsService.GetTowns(); 
    return View(); // ideally you should be returning a model 
} 
[HttpPost] 
public ActionResult Index(YourModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ViewBag.Towns = _skrsService.GetTowns(); // re-populate the SelectList 
     return View(model); 
    } 
    // save and redirect 
} 

しかし、好ましくは、あなたが選択リストではなくViewBagのプロパティを含むビューモデルを使用する必要がありますする必要があります。

関連する問題