我正在为列表框创建月份列表。控制器捕获所选月份并将其存储在会话中,如果用户导航离开页面然后返回。
这是控制器:
public ActionResult Index(int[] Months)
{
if (Session["Months"] == null || Months!= null)
Session["Months"] = Months;
else if (Months== null)
Months= Session["Months"] as int[];
IList<SelectListItem> MonthsList = utility.GetMonths().OrderBy(r => r.Name)
.Select(r => new SelectListItem
{
Text = r.Name,
Value = r.Id.ToString(),
Selected = Months == null ? false : Months.Contains(r.Id)
}).ToList();
var model = new DataModel
{
SelectList = MonthsList,
Data = GetDataByMonths(Months)
};
return (model);
}
以下是观点:
@Html.ListBox("Months", Model.SelectList)
当用户从ListBox中选择项目时,即使在提交表单后,它们也会突出显示。但是,当用户导航离开然后返回SelectListItems被正确标记为Selected = true但DOM不显示此内容。
关于为什么这只在使用会话时不起作用的任何想法?
编辑:
尝试:
@Html.ListBox("Months", new MultiSelectList(Model.Months, "Value", "Text", Model.SelectedMonths), new { size = 8 })
在调试时,变量显示正确的值,它们在DOM中没有正确突出显示。
答案 0 :(得分:0)
您是否尝试过SelectList
类型或MultiSelectList
而不是IEnumerable<SelectListItem>
?我不知道有任何其他方法告诉ListBox哪个属性是value
,哪个是text
。
即
MultiSelectList list = new MultiSelectList(monthsList, "Value", "Text");
并返回list
对象?
答案 1 :(得分:0)
我最终在html中创建了列表框,而不是使用@html.listbox()
<select name="Months" id="Months" multiple="multiple" size="8">
@foreach (var a in Model.Months)
{
<option value="@a.Value" @(a.Selected.ToString() == "True" ? "selected='selected'" : "")>@a.Text</option>
}
</select>