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

What is the best ways to bind @Html.DropDownListFor in ASP.NET MVC5?

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

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

是否可以直接从模型 绑定 @Html.DropDownListFor 而无需在 ASP.NET MVC5 中的 Controller 中使用 Viewbag 或任何额外的方法?您能否举一些例子来最好地执行此操作?

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

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

视图模型是一个简单的 POCO class 用于在视图与操作方法之间传输数据,反之亦然。它们特定于视图。添加视图只需要的属性。

public class CreateUserVm
{
   public IEnumrable<SelectListItem> Labs { set;get;}
   public int SelectedLabId { set;get;}
   //Add other properties as needed for the view
}

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

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);
}

并在强类型化到此视图模型的视图中,调用 DropDownListFor 辅助方法

@model CreateUserVm
@Html.DropDownListFor(f=>f.SelectedLabId, Model.Labs,"Select one")

预先select在下拉列表中选择一个选项

如果您想在 razor 呈现页面时预先 select 一个选项,您可以将视图模型的 SelectedLabId 属性 值设置为 value 属性 选项项(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);
}

如果您想使用真实数据,而不是硬编码的 2 项,您可以这样做

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

假设 dbContext 是您的 DbContext class 对象并且它有一个类型为 DbSet<Lab>Labs 属性,其中每个实验室实体都有一个 ID 和名称属性.

您的模型中包含列表项,您的工作进展顺利。我不知道你是如何在你的代码中实现它的。

您的模型 class 中的 Lab 属性 应该是您想要的 IEnumerable、List 或 Collection。然后在您的剃刀视图中,看起来不错。

也许您忘记了在将列表发送到视图之前从控制器中的操作方法初始化列表。例如:

var model = new ViewModel{

Labs = repository.GetLabs();
}

以上我假设存储库应该是可以访问或获取所需数据的方法,并且 Labs 属性 在 ViewModel [中定义为 IEnumerable<Lab> Labs class。

一切正常。也许您应该清楚自己遇到了什么错误。