一种在MVC Razor中使用DropDowns制作DropDownListFor的方法

时间:2016-11-14 19:37:54

标签: c# asp.net-mvc razor html.dropdownlistfor

假设我有一个人类

public string Name {get;set;}

public List<string> ListOfStrings  {get;set;}

我试图将List<Person>绑定到DropDownListFor,所以它看起来像那样

下拉:
- 第一人称 - 第一人的listOfStrings的第一个字符串
- 第一人的listOfStrings的第二个字符串
- 第二人 - 第二人的listOfStrings的第一个字符串
- 第二人的listOfStrings的第二个字符串
- 第二人的listOfStrings的第三个字符串

有没有办法让它像那样?只有列表中的字符串应该是可选择的而不是该人的姓名。我没关系

2 个答案:

答案 0 :(得分:2)

这是相对简单的。唯一棘手的部分是将所有字符串值选择到一个大列表中,同时仍然键入特定的人。值得庆幸的是,resultSelector采用了SelectListItem param,可以让您做到这一点。然后,您只需将所有内容选择到Group列表中,并为每个属性指定ViewBag.DropDownOptions = db.People .SelectMany(m => m.ListOfStrings, (m, str) => new { Name = m.Name, String = str }) .Select(m => new SelectListItem { Value = m.String, Text = m.String, Group = new SelectListGroup { Name = m.Name } }); 属性。然后,Razor将很乐意在HTML中生成适当的optgroup。需要注意的一点是:我认为指定组的能力直到MVC 5才出现。

@Html.DropDownListFor(m => m.Foo, (IEnumerable<SelectListItem>)ViewBag.DropDownOptions)

然后,在您看来:

function isAppleSafari(userAgent){
  var iPhone = userAgent.match(/iPhone/i) !== null;
  var Apple = userAgent.match(/Apple/i) !== null;
  var Mac = userAgent.match(/Mac/i) !== null;
  var iPod = userAgent.match(/iPod/i) !== null;
  var iOS = userAgent.match(/iOS/i) !== null;
  var Safari = userAgent.match(/Safari/i) !== null;
  return Safari && (iPhone || Apple || Mac || iPod || iOS);
}

// Use like this...
if(isAppleSafari(navigator.userAgent)){ 
  document.getElementsByTagName('head')[0].insertAdjacentHTML('beforeend', '<link rel="stylesheet" href="/Regal-en-us/includes/themes/MuraBootstrap3/assets/bootstrap/css/iphone.css">');
}

答案 1 :(得分:1)

我不知道除了模型和foreach循环之外是否还有Razor这样做的方法,但你正在寻找的HTML将是这样的

<select>
  <optgroup label="Person1">
    <option value="ListOfStrings1">ListOfStrings1</option>
    <option value="ListOfStrings2">ListOfStrings2</option>
  </optgroup>
  <optgroup label="Person2">
    <option value="ListOfStrings3">ListOfStrings3</option>
    <option value="ListOfStrings4">ListOfStrings4</option>
  </optgroup>
</select>

编辑:从MVC 5.2开始,实际上的一种方法。您可以找到有关如何使用Razor创建此HTML的详细说明,而不是使用foreach循环here