使用 Linq 在 MVC C# 中设置下拉列表的现有值
Setting an existing value for dropdown in MVC C# with Linq
我有一个从数据库呈现的下拉列表,只需要能够设置一个现有值(如果存在)。 _jobService.GetTenancyForJob 如果一个已经存在,则获取一个值,而另一个服务只是 returns 每个项目的 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>
您需要将 ViewBag 数据转换为 SelectList,如下所示:
var data = (SelectList)Viewbag.TenancyList;
您需要这样做,因为 ViewBag 携带对象数据类型。
铸造后你可以从 data.Items.
得到你的 tenacyList
在 return 视图之前,您需要在控制器中设置 属性 TenancyId
的值。如果该值与您的其中一个选项的值匹配,则在显示视图时将选择该选项。另请注意,您不应通过插入额外的 SelectListItem
(添加 <option value="">
)来添加 'empty' 选项,而是使用接受 optionLabel
的 DropDownListFor()
的重载] 它正确地添加了一个带有 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>
我有一个从数据库呈现的下拉列表,只需要能够设置一个现有值(如果存在)。 _jobService.GetTenancyForJob 如果一个已经存在,则获取一个值,而另一个服务只是 returns 每个项目的 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>
您需要将 ViewBag 数据转换为 SelectList,如下所示:
var data = (SelectList)Viewbag.TenancyList;
您需要这样做,因为 ViewBag 携带对象数据类型。 铸造后你可以从 data.Items.
得到你的 tenacyList在 return 视图之前,您需要在控制器中设置 属性 TenancyId
的值。如果该值与您的其中一个选项的值匹配,则在显示视图时将选择该选项。另请注意,您不应通过插入额外的 SelectListItem
(添加 <option value="">
)来添加 'empty' 选项,而是使用接受 optionLabel
的 DropDownListFor()
的重载] 它正确地添加了一个带有 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>