我有两个多选列表框;一个月,一个月,如下:
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeMonths, Model.TimeframeMonths)
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeYears, Model.TimeframeYears)
我将这两个值以逗号分隔列表(string / nvarchar)保存到数据库中。值如下:月份: 1,3,7; 年: 2002,2005
由于某种原因,当我将值拉回到表单时,这些月份在列表框中预先选择正常,但年份不是。
有什么想法吗?
编辑 - 其他代码示例:
控制器 - 管理
public ActionResult Manage(Guid id)
{
var list = _listService.GetList(id);
var model = LoadModelFromObject(list);
model.TimeframeMonths = GenerateMonthDropdown();
model.TimeframeYears = GenerateYearDropdown(model.IncludeGuestsArrivedInTimeframeYears.Split(','));
model.DaysOfWeek = GenerateDaysOfWeekDropdown();
return View(model);
}
控制器 - '助手'
private IList<SelectListItem> GenerateYearDropdown(string[] selected)
{
var list = new List<SelectListItem>();
var startYear = DateTime.Now.Year - 10;
for (int idx = startYear; idx < startYear + 11; idx++)
{
list.Add(new SelectListItem
{
Value = idx.ToString(),
Text = idx.ToString(),
Selected = selected != null && selected.Contains(idx.ToString())
});
}
return list;
}
查看
@Html.CheckBoxFor(m => m.IncludeGuestsArrivedInTimeframe)
@Html.LabelFor(m => m.IncludeGuestsArrivedInTimeframe)
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeMonths, Model.TimeframeMonths)
@*@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeYears, Model.TimeframeYears)*@
@Html.ListBox("IncludeGuestsArrivedInTimeframeYears", Model.TimeframeYears)
答案 0 :(得分:4)
对于要预先选择的选项,您需要将Selected
类的SelectItemList
属性设置为true。
示例:
@{
var foo = new List<SelectListItem> {
new SelectListItem { Text = "Foo 1", Value = "1", Selected = true },
new SelectListItem { Text = "Foo 2", Value = "2" },
new SelectListItem { Text = "Foo 3", Value = "3", Selected = true }
};
}
@Html.ListBox("foo", foo)
在这种情况下,Foo 1和Foo 3应该显示为预选。上面的代码生成以下html标记:
<select id="foo" multiple="multiple" name="foo">
<option selected="selected" value="1">Foo 1</option>
<option value="2">Foo 2</option>
<option selected="selected" value="3">Foo 3</option>
</select>
修改强>
首先,替换此代码:
list.Add(new SelectListItem {
Value = idx.ToString(),
Text = idx.ToString(),
Selected = selected != null && selected.Contains(idx.ToString())
});
使用此代码:
list.Add(new SelectListItem {
Value = idx.ToString(),
Text = idx.ToString(),
Selected = true
});
然后运行该应用。如果所有选项都是预选的,那么我敢打赌这selected != null && selected.Contains(idx.ToString())
不符合条件。
答案 1 :(得分:1)
另一种方法
@Html.ListBox("categoryId", new MultiSelectList(ViewData["categories"] as System.Collections.IEnumerable, "Id", "CategoryName", Model.tIdx_ProductCategories.Select(x => x.CategoryId).AsEnumerable()))
说明:
categoryId
- 当呈现为html ViewData["categories"]
- 包含Id
和CategoryName
属性的类别列表Model.tIdx_ProductCategories
包含要在列表框中选择的类别ID列表。答案 2 :(得分:0)
看起来(例如Preselect Items in Multiselect-Listbox (MVC3 Razor))Razor引擎很高兴忽略 Selected属性,并通过调用对象上的ToString()来比较模型中的列表和提供的选项列表从模型中使用字符串比较来选择。
我无法向自己解释为什么此行为与Html.ListBox()一起使用,它不使用任何模型并且需要SelectListItem的集合。
认为这是一个错误,但最近似乎没有解决。