我有一个下拉列表,未在视图中显示默认值。调试后,我可以看到使用正确的值拉出默认值但它们没有显示。我将IEnumerable存储在我的ViewModel
中实施例: DropDown 1应该显示True(即DB中的值),但显示第一个值" Not Set"
查看
@model IList<NavLiveWebInterface.ViewModel.Proc_Item_SKUViewModel>
for (var i = 0; i < Model.Count(); i++)
{
<div class="editor-label">
@Html.LabelFor(m => Model[i].Filterable)
</div>
<div class="editor-field">
@Html.DropDownListFor(m => Model[i].Filterable,Model[i].TrueFalse)
</div>
@Html.ValidationMessageFor(m => Model[i].Filterable,"Please Select a Value")
}
查看模型
public bool? Filterable { get; set; }
public IEnumerable<SelectListItem> TrueFalse
{
get
{
return new[]
{
new SelectListItem { Value = "Not Set", Text = "Not Set" },
new SelectListItem { Value = "True", Text = "True" },
new SelectListItem { Value = "False", Text = "False" }
};
}
}
答案 0 :(得分:2)
DropDownListFor
不支持匹配索引表达式中的选定值。
您需要为每个条目创建一个SelectList
,其中当前选定值已传递给它。
for (var i = 0; i < Model.Count(); i++)
{
<div class="editor-label">
@Html.LabelFor(m => Model[i].FilterableString)
</div>
<div class="editor-field">
@Html.DropDownListFor(m => Model[i].Filterable, new SelectList(Model[i].TrueFalse, "Value", "Text", Model[i].Filterable));
</div>
@Html.ValidationMessageFor(m => Model[i].Filterable, "Please Select a Value")
}
您还在重复下拉列表的选项。仅从选项中创建的SelectList
需要是唯一的(为了具有选定状态),因此您可以共享True
,False
和{的单个数据列表{1}}选项并通过null
提供(但不要忘记将其强制转换回ViewBag
构造函数中的IEnumerable<SelectListItem>
,否则会出错)
您可以在ViewBag中创建单个共享列表,如此控制器代码:
SelectList
我使用了ViewBag.Filterable = new List<KeyValuePair<bool?, string>>()
{
new KeyValuePair<bool?, string>( null, "Not Set" ),
new KeyValuePair<bool?, string>( true, "True" ),
new KeyValuePair<bool?, string>( false, "False" )
};
,因为这正是您为选项创建的内容。
并在视图中访问它:
KeyValuePair
如果您没有使用索引项,则更简单的@Html.DropDownListFor(m => Model[i].Filterable, new SelectList((IEnumerable<KeyValuePair<bool?, string>>)ViewBag.Filterable, "Key", "Value", Model[i].Filterable));
会自动将值绑定到@Html.DropDown("Filterable")
(例如ViewModel
),将下拉列表绑定到Model.Filterable
同名的财产(例如ViewBag
)。在较简单的情况下,这可以用于更短的代码。