2012-01-05 9 views
1

私の最初のMVCプロジェクトで、誰かが助けてくれることを願っている問題に遭遇しました。DropDownListFor - Model Binding

基本的に私はDropDownListForオブジェクトを持っています。これは、ユーザーが選択したアイテムを後で消費するために属性に選択して格納するための利用可能な時間のリストを設定したいものです。

以下はnull値のエラーを生成していますので、わかりやすいものがありません。何か助けていただければ幸いです。ここで

は、私が持っているものです。

コントローラー:

private MyModelObject m_model = new MyModelObject(); 
public ActionResult Index() 
{ 
    var AvailTimes = new SelectList(new[] 
    { 
     new {Value="00:00",Text="12:00 AM"}, 
     new {Value="00:30",Text="12:30 AM"}, 
     new {Value="01:00",Text="1:00 AM"}, 
     new {Value="22:30",Text="10:30 PM"}, 
     new {Value="23:00",Text="11:00 PM"}, 
     new {Value="23:30",Text="11:30 PM"},     
    }); 
    return View(m_model); 
} 

モデル:

public class MyModelObject 
{ 
    public string StartTime { get; set; } 
    public IEnumerable<SelectList> AvailTimes { get; set; } 
} 

ビュー:

@Html.DropDownListFor(model => model.StartTime, 
         new SelectList(model.AvailTimes, "Value", "Text")) 

答えて

8

モデルをプライベート変数にしないでください。リクエストが送信されるたびに、新しいコントローラインスタンスが作成されるので、アクション間で再利用できるとは思わないでください。また、アクションで宣言したローカル変数AvailTimesで有用なことをしていないようで、高速ガベージコレクションの対象です。あなたのモデルも間違っています。 AvailTimesプロパティはIEnumerable<SelectListItem>で、IEnumerable<SelectList>ではありません。最初のビューモデルを固定することで

レッツ・スタート:

public class MyModelObject 
{ 
    public string StartTime { get; set; } 
    public IEnumerable<SelectListItem> AvailTimes { get; set; } 
} 

その後、ビューモデル養うコントローラのアクション:

public ActionResult Index() 
{ 
    var model = MyModelObject 
    { 
     AvailTimes = new[] 
     { 
      new SelectListItem { Value = "00:00", Text = "12:00 AM" }, 
      new SelectListItem { Value = "00:30", Text = "12:30 AM" }, 
      new SelectListItem { Value = "01:00", Text = "1:00 AM" }, 
      new SelectListItem { Value = "22:30", Text = "10:30 PM" }, 
      new SelectListItem { Value = "23:00", Text = "11:00 PM" }, 
      new SelectListItem { Value = "23:30", Text = "11:30 PM" },     
     } 
    }; 
    return View(model); 
} 

、最終的には強く型付けされたビュー:

@model MyModelObject 
@Html.DropDownListFor(x => x.StartTime, Model.AvailTimes) 

ビューモデルで利用可能な時間帯を直接割り当てることもできます。

public class MyModelObject 
{ 
    public string StartTime { get; set; } 
    public IEnumerable<SelectListItem> AvailTimes 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Value = "00:00", Text = "12:00 AM" }, 
       new SelectListItem { Value = "00:30", Text = "12:30 AM" }, 
       new SelectListItem { Value = "01:00", Text = "1:00 AM" }, 
       new SelectListItem { Value = "22:30", Text = "10:30 PM" }, 
       new SelectListItem { Value = "23:00", Text = "11:00 PM" }, 
       new SelectListItem { Value = "23:30", Text = "11:30 PM" },     
      }; 
     } 
    } 
} 

今すぐあなたのコントローラのアクションにはなるかもしれない:

public ActionResult Index() 
{ 
    var model = MyModelObject(); 
    return View(model); 
} 

とビューは明らかに変わらないままです。

+1

お返事ありがとうございました。あなたの返信は役に立ちましたが、非常に有益でした。 – ServerMonkey

0

Model.AvailTimesの値は決して割り当てられないため、デフォルトではnullです。