DropDownListFor - 模型绑定

Ser*_*key 2 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);
}
Run Code Online (Sandbox Code Playgroud)

模型:

public class MyModelObject
{
    public string StartTime { get; set; }
    public IEnumerable<SelectList> AvailTimes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

视图:

@Html.DropDownListFor(model => model.StartTime, 
                       new SelectList(model.AvailTimes, "Value", "Text"))
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 11

不要将模型作为控制器的私有变量.每次发送请求时,都会创建一个新的控制器实例,因此不要认为您可以在操作之间重用它.此外,您似乎没有对AvailTimes您在操作中声明的局部变量执行任何有用的操作,并且它受快速垃圾回收的约束.你的模型也不正确.该AvailTimes物业必须是IEnumerable<SelectListItem>和不IEnumerable<SelectList>.

让我们首先修复视图模型:

public class MyModelObject
{
    public string StartTime { get; set; }
    public IEnumerable<SelectListItem> AvailTimes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后控制器动作将提供视图模型:

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);
}
Run Code Online (Sandbox Code Playgroud)

最后是强类型视图:

@model MyModelObject
@Html.DropDownListFor(x => x.StartTime, Model.AvailTimes)
Run Code Online (Sandbox Code Playgroud)

您还可以直接在视图模型中分配可用的小时数:

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" },                 
             }; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您的控制器操作可能变为:

public ActionResult Index()
{
    var model = MyModelObject();
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

而且观点显然保持不变.