DropDownListFor - 模型绑定

时间:2012-01-05 09:49:07

标签: asp.net-mvc-3

我的第一个MVC项目并遇到了一个我希望有人可以协助的问题。

基本上我有一个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"))

2 个答案:

答案 0 :(得分:11)

不要让您的模型成为控制器的私有变量。每次发送请求时,都会创建一个新的控制器实例,因此不要认为您可以在操作之间重用它。此外,您似乎没有对您在操作中声明的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 :(得分:0)

永远不会分配Model.AvailTimes的值,因此默认为null。