我正在处理需要从下拉列表中选择的mvc中的字符串项列表。下拉列表绑定正常,值设置正常,但即使正在迭代的当前项与下拉列表中的项匹配,也没有预先选择它的值,任何人都可以指向正确的方向?
@for (var i = 0; i < Model.StringList.Count; i++)
{
if (BL.Helpers.StringHelpers.Validate(Model.DisplayStringSegments[i]))
{
<div id="editor-field">
@Html.DropDownListFor(m => m.StringList[i], Model.PosterOptions, String.Empty, new { })
</div>
}
else
{
<div id="editor-label">@Model.StringList[i]</div>
@Html.HiddenFor(model => model.StringList[i])
}
}
因此,对于这种情况,Options是一个只包含一个值的字符串列表,“Test” - &gt;将它们设置为文本和值;
PosterOptions.Add(new SelectListItem() { Text = "Test", Value = "Test" });
有人能告诉我为什么当前的StringList [i]没有被预先选中,即使它的值为“Test”吗?
答案 0 :(得分:4)
对于遇到这种情况的任何人;
我不得不“解决”一个解决方案,我这样做了:
更改我的ViewModel(Model.Options)
List<SelectListItem> to a List<string>
将我的下拉列表选择更改为以下内容,强制所选值;
<div id="editor-field">
@{
string currentString = Model.StringList.ElementAt(i).ToString();
}
@Html.DropDownListFor(m => m.StringList[i], new SelectList(Model.Options, currentString), String.Empty, new {})
</div>
也许有更好的方法,但这有效!
答案 1 :(得分:0)
另一种方法是在列表创建期间设置当前所选项目,如下所示:
PosterOptions.Add(new SelectListItem() { Text = "Test", Value = "Test", Selected = true });
答案 2 :(得分:0)
我遇到了同样的问题,你的回答对我有所帮助。我不认为这是一个“黑客”。因为在您的问题中,您为所有下拉列表使用相同的SelectList,所以即使您提到您不想为下拉列表创建多个列表,但是当您需要指定多个下拉列表时,我看不到另一种方法不同的选定值。
作为一个小型重构,您可以摆脱temp变量并直接访问所选值:
@Html.DropDownListFor(m => m.StringList[i], new SelectList(Model.Options, Model.StringList[i]), String.Empty, new {})
在您的示例中,您不需要区分文本和值,但在我的情况下,它是必需的。当需要时,可以通过提供SelectList的值和文本字段名称来完成。例如,假设您需要多个具有国家/地区值的下拉菜单,例如:
国家/地区类:
public class Country
{
public string Code { get; set; }
public string Name { get; set; }
}
型号:
public List<string> CustomerCountryList { get; set; }
public IEnumerable<Country> CountryList { get; set; }
和视图:
@Html.DropDownListFor(m => m.CustomerCountryList[i], new SelectList(Model.CountryList, "Code", "Name", Model.CustomerCountryList[i]))