使用 Linq 在 MVC C# 中设置下拉列表的现有值



我有一个从数据库呈现的下拉列表,只需要能够设置一个现有值(如果存在)。 _jobService.GetTenancyForJob 如果一个值已经存在,则获取一个值,而另一个服务只返回每个项目的 id 和值。我需要能够在控制器中设置选定的列表项,但只是在语法上苦苦挣扎(是的,它使用 viewbag 只是为了测试将使用 ViewModel)。

我以前以多种方式这样做过,只是想知道在这种情况下如何完成......任何指示赞赏。

var jobTenancies = _jobService.GetTenancyForJob(id);
var getTenancies = _jobService.GetAllJobTenancies();
var tenancyList = getTenancies.Select( t => new SelectListItem()
{
  Text = t.JobTenancyName, 
  Value = t.Id.ToString()
}).ToList();
tenancyList.Insert(0, new SelectListItem() { Text="", Value = "" } );
Viewbag.TenancyList = tenancyList;

编辑:在视图中

<div class="control-group">
  @Html.BootstrapLabelFor(model => model.TenancyName)
  <div class="controls">
    @Html.DropDownListFor(x=>x.TenancyId, (List<SelectListItem>)ViewBag.TenancyList)
    @Html.BootstrapValidationMessageFor(model => model.TenancyId)
  </div>
</div>

在返回视图之前,需要在控制器中设置属性TenancyId的值。如果该值与其中一个选项的值匹配,则在显示视图时将选择该选项。另请注意,您不应该通过插入额外的SelectListItem(添加<option value="">)来添加"空"选项,而是使用接受optionLabelDropDownListFor()重载,从而正确添加具有null值的选项(<option value>)。正如您指示的打算使用视图模型时,它可能包括

public class TenancyVM
{
  [Required(ErroMessage = "Please select tenancy")]
  [Display(Name = "Tenancy")]
  public int? TenancyID { get; set; }
  ....
  public SelectList TenancyList { get; set; }
}

控制器

public ActionResult Edit(int id)
{
  TenancyVM model = new TenancyVM();
  model.TenancyID = jobService.GetTenancyForJob(id);
  ConfigureEditModel(model);
  return View(model);
}
// Gets called in the GET and in POST method if the view is returned
private void ConfigureEditModel(TenancyVM model)
{
  var tenancies = _jobService.GetAllJobTenancies();
  model.TenancyList = new SelectList(tenancies , "Id", "JobTenancyName");
}

视图

<div class="control-group">
  @Html.BootstrapLabelFor(m => m.TenancyID)
  <div class="controls">
    @Html.DropDownListFor(m => m.TenancyID, Model.TenancyList, "-Please select-")
    @Html.BootstrapValidationMessageFor(m => m.TenancyID)
  </div>
</div>

您需要将ViewBag数据转换为SelectList,如下所示:

var data =  (SelectList)Viewbag.TenancyList;

您需要这样做,因为 ViewBag 携带对象数据类型。铸造后,您可以从数据中获取您的韧性列表。项目。

最新更新