如何绑定下拉列表以正确建模,以便能够将值从视图传递回控制器

时间:2012-10-16 17:02:17

标签: asp.net-mvc-3 binding collections

我正在尝试更新复合页面模型,该模型作为其属性之一具有对象列表。

我的模型看起来像这样:

public class PageViewModel 
{
    public ProgramListVM ProgramsDDL { get; set; }

    public PageViewModel()
    {
        this.ProgramsDDL = new ProgramListVM();
    }
}

ProgramListVM类是:

public class ProgramListVM
{
    public List<ProgramVM> Program_List { get; set; }
    public int SelectedValue { get; set; }

    public ProgramListVM()
    {
        this.Program_List = new List<ProgramVM>();
        this.SelectedValue = 0;
    }
}

ProgramVM是:

public class ProgramVM
{
    public int ProgramID { get; set; }
    public string ProgramDesc { get; set; }

    public ProgramVM(int id, string code)
    {
        this.ProgramID = id;
        this.ProgramDesc = code;
    }
}

我尝试通过以下两个来呈现此下拉列表:

1 -

  <%: Html.DropDownList("ProgramsDDL", new SelectList(Model.Page6VM.ProgramsDDL.Program_List, "ProgramID", "ProgramDesc", Model.Page6VM.ProgramsDDL.SelectedValue))%>

2 -

 <%: Html.DropDownListFor(m => m.Page6VM.ProgramsDDL.Program_List, new SelectList(Model.Page6VM.ProgramsDDL.Program_List, "ProgramID", "ProgramDesc"), Model.Page6VM.ProgramsDDL.SelectedValue)%>

但是当我尝试通过控制器动作更新我的模型时

[HttpPost]
    public ActionResult UpdateUser(PageViewModel model)  
    {
    }

model.ProgramsDDL.count为零。

呈现此下拉列表并能够设置所选索引的最佳方法是什么,并且还能够将所选索引发送回控制器?

1 个答案:

答案 0 :(得分:1)

您混淆了Html.DropDownListFor()的参数。下面的代码示例应该有效。

<%: Html.DropDownListFor(m => m.SelectedValue, 
                              new SelectList(Model.Page6VM.ProgramsDDL.Program_List, "ProgramID", "ProgramDesc"), 
                              null) %>

您的模型中还应该有一个已回发的SelectedValue。

public class PageViewModel 
{
    public ProgramListVM ProgramsDDL { get; set; }
    public int SelectedValue { get; set; }

    public PageViewModel()
    {
        this.ProgramsDDL = new ProgramListVM();
    }
}

另外default model binder can't map complex collections to your model。无论如何,你可能不需要在后期行动中使用它们。