假设我有一个人类
public string Name {get;set;}
public List<string> ListOfStrings {get;set;}
我试图将List<Person>
绑定到DropDownListFor,所以它看起来像那样
下拉:
- 第一人称
- 第一人的listOfStrings的第一个字符串
- 第一人的listOfStrings的第二个字符串
- 第二人
- 第二人的listOfStrings的第一个字符串
- 第二人的listOfStrings的第二个字符串
- 第二人的listOfStrings的第三个字符串
等
有没有办法让它像那样?只有列表中的字符串应该是可选择的而不是该人的姓名。我没关系
答案 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。