2017-07-03 10 views
0

私のコントローラからドロップダウンリストを取り込み、viewbagsを通してビューに渡しました。私はフォームを提出し、null値を取得するまで、バインディングは大丈夫です。しかし、私はビュー自体にコードを入れて、それは動作します。キャストがありませんか?DropdownListはViewbagバインドから値を取得しません

"年" のための私のドロップダウンリストの抜粋:

List<SelectListItem> year = new List<SelectListItem>(); 

       for (var i = 1990; i <= DateTime.Now.Year; i++) 
      { 
       year.Add(new SelectListItem 
       { 
        Text = i.ToString(), 
        Value = i.ToString(), 
        Selected = false 
       }); 
      } 

ViewBag.Year = year; 

私が取得エラー\:ViewBag.YearデータはFFコードを持っている私のコントローラからであるのに対し

@Html.DropDownListFor(model => model.Year, new SelectList(ViewBag.Year, "Value", "Text"), htmlAttributes: new { @class = "form-control"}) 

enter image description here

答えて

1

ユーザーFOを送信する場合を考えてみrmと検証メカニズムが失敗した場合(同じビューを返す)DropDownListForに渡された場合の値はnullになります(POSTリクエスト後に再投入されないため)ArgumentNullExceptionがスローされます。

[HttpPost] 
public ActionResult SubmitForm(FormModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // other stuff 
    } 

    List<SelectListItem> year = new List<SelectListItem>(); 

    for (var i = 1990; i <= DateTime.Now.Year; i++) 
    { 
     year.Add(new SelectListItem 
     { 
      Text = i.ToString(), 
      Value = i.ToString(), 
      Selected = false 
     }); 
    } 

    ViewBag.Year = year; // this line repopulates ViewBag when submit failed 

    return View(model); 
} 

同様の問題:

Value cannot be null. Parameter name: items (DrodownList)

は、次の例のようにGETメソッドで ViewBag.Yearを移入する方法を複製することにより、POSTメソッドで同じビューを返すときに、単に ViewBag.Yearを再移植、この問題を解決するために、

Value cannot be null. Parameter name: items (in Dropdown List) ASP.NET MVC5

+0

ああ、私はコードを書き直す必要があります。うーん、非効率なようです。私はリストを返す独立したメソッドで人口を分離しようとし、必要な時に呼び出すことにしよう。 –

+0

'ViewBag.Year'を生成し、そこでGET&POSTメソッドの両方でメソッドを呼び出す独立したメソッドを作成する方が好きです。私は何が間違っているのか説明しました:POSTメソッドが同じビューを返す間、 'ViewBag'は再生成されません。 –

+0

この場合、プログラムでリストに値を設定する場合、デフォルト値を設定できません –

関連する問題