Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq在MVC中设置下拉列表的现有值_C#_Linq_Asp.net Mvc 4_Html.dropdownlistfor_Selectlist - Fatal编程技术网

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

C# 使用Linq在MVC中设置下拉列表的现有值,c#,linq,asp.net-mvc-4,html.dropdownlistfor,selectlist,C#,Linq,Asp.net Mvc 4,Html.dropdownlistfor,Selectlist,我有一个从数据库呈现的下拉列表,只要能够设置一个现有的值(如果它存在的话)_如果一个服务已经存在,而另一个服务只返回每个项的id和值,那么jobService.GettenacyForJob将获取一个值。我需要能够在控制器中设置所选的列表项,但只是与语法斗争是的,它使用viewbag只是为了测试将使用ViewModel 我以前做过很多这样的事情,只是想知道在这种情况下会怎么做。。。欢迎指点 var jobTenancies = _jobService.GetTenancyForJob(id);

我有一个从数据库呈现的下拉列表,只要能够设置一个现有的值(如果它存在的话)_如果一个服务已经存在,而另一个服务只返回每个项的id和值,那么jobService.GettenacyForJob将获取一个值。我需要能够在控制器中设置所选的列表项,但只是与语法斗争是的,它使用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。

在返回视图之前,需要在控制器中设置属性tenacyId的值。如果该值与某个选项的值匹配,则在显示视图时将选择该选项。另外请注意,您不应该通过插入额外的SelectListItem来添加“empty”选项,而应该使用DropDownListFor的重载来接受optionLabel,它正确地添加了一个具有空值的选项。如您所示,您打算使用视图模型,它可能包括

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");
}
看法


显示视图。如果绑定到某个属性且该属性的值与选项值之一匹配,则将选择该属性。并且不要通过插入SelectListItem来添加标签选项。使用@Html.DropDownLstFor重载接受标签选项。添加到视图代码中。如果选项中的值为1-10,并且模型属性tenacyId的值为2,则在显示视图时将选择第二个选项。并将控制器代码更改为Viewbag.tenacyList=new SelectListGetTenances,Id,JobTenancyName;在@Html.DropDownListForx=>x.tenacyId的视图中,选择ListViewBag.tenacyList,-请选择-生成空选项Tanks Stephen,按照您的建议进行操作。如果您添加您的评论作为答案,我将标记为正确。干杯ViewBag属性是List,OP已将其强制转换为html帮助程序中的List!
<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>