代码之家  ›  专栏  ›  技术社区  ›  AndreasKnudsen

ASP.NET MVC 2多选列表框。如何读取控制器中的值

  •  1
  • AndreasKnudsen  · 技术社区  · 15 年前

    我很难让一个相当简单的绑定工作。

    编辑员工时,我希望显示一个列表框,其中包含系统中所有可用的角色(所选员工的角色),保存员工时,我希望所选角色由MVC填充到Employee对象中,该对象作为控制器的输入参数。

    我知道我可以从request.form中读取逗号分隔的值,但我不想直接在控制器中接触request对象,因为这会使它们更难测试。

    让mvc提供角色列表作为输入参数的最佳方法是什么?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Daniel T.    15 年前

    你有两个选择。首先是获取控制器中的值并将它们放入 ViewData 字典,就像这样:

    var list = EmployeeRoles.GetAll();
    ViewData["EmployeeRoles"] = list;
    

    然后在视图中使用:

    <%= (List<EmployeeRoles>)ViewData["EmployeeRoles"] %>
    

    这种方式有点难看,因为视图必须知道它可以使用“魔术字符串”将对象从 可视数据 字典,然后必须重新铸造成原来的类型。

    public class EmployeeViewModel
    {
        public Employee Employee { get; set; }
        public ICollection<EmployeeRoles> EmployeeRoles { get; set; }
    
        public EmployeeViewModel(Employee employee, ICollection<EmployeeRoles> roles)
        {
            Employee = employee;
            EmployeeRoles = roles;
        }
    }
    

    然后将其从控制器传递到视图,如下所示:

    return View(new EmployeeViewModel (employee, roles);
    

    在视图侧,您可以像访问任何其他模型一样访问它:

    <%= Model.Employee.Name %>
    <%= Model.EmployeeRoles.First() %>
    

    至于将数据从视图返回到控制器,默认的模型绑定器实际上非常好。你只要用一个 HtmlHelper 在视图上让它知道应该将值作为什么发送回。我眼前没有我的书,但应该是这样的一个文本框:

    <% Html.TextBox("Name", Model.Employee.Name) %>
    

    这个 HTMLHelp 将计算出它需要发送什么,以便模型绑定器正确绑定它。我不知道这是为了什么 DropDownBox 不过,我的头顶上。