我有一个action
检索数据并将其发送到view
. 在一个视图中,我有两个下拉菜单。
第一个下拉菜单显示称呼(例如“先生”、“女士”等),并且由于某种原因没有选择我发送的值。另一个下拉列表显示语言列表并正确选择我发送到视图的值。视图中的相关代码如下所示。
@Html.DropDownListFor(model => model.Salutation, ViewBag.salutation as IEnumerable<SelectListItem>)
@Html.DropDownListFor(model => model.Language, ViewBag.languages as IEnumerable<SelectListItem>)
在控制器中,我有以下代码来获取下拉数据。
ViewBag.salutation = new List<SelectListItem>() {
new SelectListItem() { Text = "", Value = "" },
new SelectListItem() { Text = "Mr.", Value = "Mr." },
new SelectListItem() { Text = "Ms.", Value = "Ms." },
new SelectListItem() { Text = "Mrs.", Value = "Mrs." }
};
和
var languages = (from l in db.Languages.ToList()
select new SelectListItem()
{
Text = l.Language,
Value = l.LanguageId.ToString()
}).ToList();
languages.Insert(0, new SelectListItem() { Text = "", Value = "" });
ViewBag.languages = languages;
我能想到的唯一区别是语言下拉列表有一个整数作为值,而称呼下拉列表有文本作为值。这就是称呼下拉菜单不起作用的原因吗?我知道我可以通过每个称呼List<SelectListItem>
项目并Selected
根据我从数据库中检索到的值设置属性。但我希望有一种更清洁的方法来做到这一点。
有任何想法吗?
谢谢
更新
我决定做我为另一个项目所做的事情。
IList<SelectListItem> _salutation = new List<SelectListItem>()
{
new SelectListItem() { Value = "", Text = "" },
new SelectListItem() { Value = "Mr.", Text = "Mr." },
new SelectListItem() { Value = "Ms.", Text = "Ms." },
new SelectListItem() { Value = "Mrs.", Text = "Mrs." }
};
// I could put the following in the declaration above, but for testing purposes it's in foreach loop.
foreach (var item in _salutation)
{
// compare to what's retrieved from database
item.Selected = item.Value == _viewData.Salutation;
}
ViewBag.salutation = _salutation;
foreach
循环后,我输出每个项目的属性,.Value
并在选择一个项目的情况下获得所有正确的值。在视图内部,我做了以下操作。.Selected
_salutation
@foreach (var item in ViewBag.salutation as IEnumerable<SelectListItem>)
{
<b>@item.Value : @item.Text : @item.Selected</b><br />
}
所有正确的文本/值都出现了,但没有一个被选中!如果我在执行后输出值,就会发生这种情况@Html.DropDownListFor()
。如果我在 html 帮助器之前输出 ViewBag.salutation,则选择了正确的值。
解决方案
我发现以下文章很有用:DropDownListFor with ASP.NET MVC。
我没有使用,而是ViewBag
将以下内容添加到 ViewModel。(显示称呼下拉的部分。)
public class TheViewModel
{
private IList<string> _salutations = new List<string>() { "", "Mr.", "Ms.", "Mrs." };
public IEnumerable<SelectListItem> SalutationItems
{
get
{
var salutations = _salutations.Select(s => new SelectListItem { Value = s, Text= s });
return salutations;
}
}
// The rest of the ViewModel
}
在View
我有以下内容。
@Html.DropDownListFor(model => model.Salutation, Model.SalutationItems)