在ASP.NET MVC5中绑定@ Html.DropDownListFor的最佳方法是什么?

Jac*_*ack 3 asp.net-mvc selectlist html.dropdownlistfor razor dropdownlistfor

我想在不使用的情况下@Html.DropDownListForModel数据绑定,Viewbag并在Web上查看许多不同的示例.但他们中的大多数使用Viewbag或扩展方法,我想要一个更好的方法来解决这个问题.我尝试了以下方法,但它似乎不起作用:

@Html.DropDownListFor(m => m.LabId, new SelectList(Model.Lab, "Id", "Name"), 
    "---- Select----", new { @class = "selectpicker" } )
Run Code Online (Sandbox Code Playgroud)

是否可以绑定@Html.DropDownListFor直接从型号不使用Viewbag或任何额外的方法ControllerASP.NET MVC5?你能举一些例子来表现最佳吗?

Shy*_*yju 5

强类型视图模型方法,不使用像ViewBag这样的动态内容

您可以为视图模型添加新属性以获取类型的SELECT选项 IEnumrable<SelectListItem>.

view model是一个简单的POCO类,用于在视图到操作方法之间传输数据,反之亦然.它们特定于观点.添加视图仅需要的属性.

public class CreateUserVm
{
   public IEnumrable<SelectListItem> Labs { set;get;}
   public int SelectedLabId { set;get;}
   //Add other properties as needed for the view
}
Run Code Online (Sandbox Code Playgroud)

在您的GET操作中,创建此视图模型的对象,加载Labs属性并将其发送到视图.

public ActionResult Create()
{
  var vm= new CreateUserVm();
  // Hard coded for demo. You can replace with real data from db
  vm.Labs = new List<SelectListItem> {
     new SelectListItem { Value="1", Text="One" },
     new SelectListItem { Value ="2", Text="Two" }
  };
  return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

并且在对该视图模型强类型的视图中,调用DropDownListFor辅助方法

@model CreateUserVm
@Html.DropDownListFor(f=>f.SelectedLabId, Model.Labs,"Select one")
Run Code Online (Sandbox Code Playgroud)

在下拉列表中预选一个选项

如果您希望在剃刀渲染页面时预先选择一个选项,则可以将SelectedLabId视图模型的value属性值设置为Option项(SelectListItem)的属性值.

public ActionResult Create()
{
  var vm= new CreateUserVm();
  // Hard coded for demo. You can replace with real data from db
  vm.Labs = new List<SelectListItem> {
     new SelectListItem { Value="1", Text="SugarLab" },
     new SelectListItem { Value ="2", Text="CandyLab" },
     new SelectListItem { Value ="3", Text="SodaLab" }
  };
  vm.SelectedLabId = 2; // Will set "CandyLab" option as selected
  return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用真实数据,而不是硬编码的2项,则可以执行此操作

vm.Labs = dbContext.Labs.Select(x=>new SelectListItem { Value=x.Id.ToString(),
                                                        Text= x.Name }).ToList();
Run Code Online (Sandbox Code Playgroud)

假设dbContext是你的DbContext类对象,它有一个Labs类型的属性,DbSet<Lab>其中每个Lab实体都有一个Id和Name属性.