在 View 上使用 ViewBag 或调用服务方法

Using ViewBag or calling service method on View

我想知道在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 )

我知道的第二种方法是直接从视图调用服务方法:

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

因此,有时我们应该 return 查看将模型传递给控制器​​上的方法 post 方法,尤其是出现错误或 ModelState 无效时。如您所知,执行此操作时 ViewBag.DepartmentList 应该再次填充 post 方法。另一方面,使用第二种方式,不需要创建和填充 ViewBag.DepartmentList get 和 post 方法。但我想知道是否有任何区别或者我应该使用哪一个?为什么?

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

如前所述,使用视图模型来保存 select 列表值

--DepartmentViewModel

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

--部门主管

 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)