在View

时间:2016-01-14 12:44:44

标签: c# asp.net-mvc-5 service-layer

我想知道在View上填写 SelectList 时应该使用什么。我知道有两种方法可以做到这一点。 第一; 在控制器的get方法上设置ViewBag。

    ViewBag.DepartmentList = new SelectList(_departmentService.GetAll(), "Id", "Name", selectedValue: user.DepartmentId);

然后在视图上使用它(你也可以使用ViewData)

    @Html.DropDownListFor(model => model.DepartmentId, (IEnumerable<SelectListItem>)ViewBag.DepartmentList )

我知道的第二种方法是直接从view中调用service方法:

    @Html.DropDownListFor(model=>model.DepartmentId,new SelectList((new DepartmentService()).GetAll(),"Id","Name", selectedValue: Model.DepartmentId ))

因此,有时我们应该返回查看控制器post方法上的传递模型到方法,尤其是存在错误或ModelState无效。如您所知,在执行此ViewBag.DepartmentList时应再次填充post方法。另一方面,使用第二种方式,不需要创建和填充ViewBag.DepartmentList get和post方法。但我想知道是否有任何差异或我应该使用哪一个?为什么呢?

2 个答案:

答案 0 :(得分:2)

这两个选项都不是一个好方法。请考虑使用ViewModel。

答案 1 :(得分:0)

如上所述,使用视图模型来保存选择列表值

- DepartmentViewModel

 [Required]
 public int DepartmentId { get; set; }
 public IEnumerable<SelectListItem> DepartmentSelectList { get; set; }

- DepartmentController

 var vm = new DepartmentViewModel();
 vm.DepartmentSelectList = new DepartmentService().GetAll().Select(c => new SelectListItem
        {
            Text = c.DepartmentName,
            Value = c.Id.ToString()
        }).ToList();

- 查看

 @Html.DropDownListFor(model => model.DepartmentId, model.DepartmentSelectList)