2012-01-05 60 views
1

我的第一個MVC項目,遇到了一個問題,我希望有人可以提供幫助。DropDownListFor - 模型綁定

基本上我有一個DropDownListFor對象,我想用一個可供選擇的時間列表來填充用戶選擇的內容並將其存儲在屬性中供以後使用。

以下是產生一個空值錯誤,所以我失去了一些明顯的東西,任何幫助將不勝感激。

這是我有:

控制器:

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

感謝Darin,你的回覆不僅有幫助,而且非常翔實。 – ServerMonkey 2012-01-05 10:06:10

0

Model.AvailTimes的值從不分配,因此默認情況下爲null。