2012-01-05 81 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。