后台:我的页面上有4个下拉列表,它们都使用一个SelectListItem
列表来提取数据。这些下拉列表中的所有4个将始终具有相同的元素。每个下拉列表顶部都有一个空元素。
问题:如果我没有从列表中选择呈现第2个的项目,则在页面加载时,第2个列表会自动选择在第1个列表中选择的项目。这是因为(我认为)列表中有一个SelectListItem
Selected = true
,而它只是在第二个列表中使用了那个。
有没有办法为多个下拉列表使用一个列表源?我不想复制这个清单4次,除非我绝对要...
代码:
//this is the list source
public IEnumerable<SelectListItem> PossibleItems { get; set; }
//this is the code on my .cshtml page
@Html.DropDownListFor(x => x.SelectedItem1, Model.PossibleItems)
@Html.DropDownListFor(x => x.SelectedItem2, Model.PossibleItems)
@Html.DropDownListFor(x => x.SelectedItem3, Model.PossibleItems)
@Html.DropDownListFor(x => x.SelectedItem4, Model.PossibleItems)
答案 0 :(得分:3)
2年前,但对于任何发现这一点的人来说,我确实在寻找答案Feussy上面的评论是要走的路。我会试着解释为什么和我找到的东西。
使用上面的OP示例。必须满足几个条件才能看到所描述的行为。
在@Html.DropDownListFor(x => x.SelectedItem1, Model.PossibleItems)
如果您查看Model.PossibleItems,您将看到预期的列表。 让代码继续下一行。 现在,如果你看一下Model.PossibleItems,你会发现Html.DropDownListFor已经在模型上修改了你的选择列表,而不仅仅是使用它! x.SelectedItem1的选项现在不仅在HTML中有一个'selected'属性,而且在你的模型中也是如此! 这似乎是对Html.DropDownListFor的不良行为,但它肯定会这样做。
现在,当您点击@Html.DropDownListFor(x => x.SelectedItem2, Model.PossibleItems)
Feussy的回答是有效的,因为它不是在模型上有一个重复使用的selectList,而是创建单独的selectLists,它们是从模型上的一些List / IEnumerable生成的,而不是被重用。
故事的寓意是不要重复使用具有可空值的selectList,因为Html.DropDownListFor在改变事物时没有问题,如果值为NULL,则不会清除任何选定的属性。
希望很清楚。
答案 1 :(得分:2)
在列表中,需要为四个下拉列表中的每一个创建不同的SelectList实体,如下所示:
@Html.DropDownListFor(x => x.SelectedItem1,
new SelectList(Model.PossibleItems, "dataValue", "textValue", Model.SelectedItem1))
@Html.DropDownListFor(x => x.SelectedItem2, Model.PossibleItems)
new SelectList(Model.PossibleItems, "dataValue", "textValue", Model.SelectedItem2))
@Html.DropDownListFor(x => x.SelectedItem3, Model.PossibleItems)
new SelectList(Model.PossibleItems, "dataValue", "textValue", Model.SelectedItem3))
@Html.DropDownListFor(x => x.SelectedItem4, Model.PossibleItems)
new SelectList(Model.PossibleItems, "dataValue", "textValue", Model.SelectedItem4))
在此示例中,“dataValue”和“textValue”是SelectListItem对象的属性,它们对应于下拉选项的值和文本元素。
答案 2 :(得分:0)
您目前拥有的代码是执行此操作的最佳方式,应该按原样运行。 SelectListItem
确实有Selected
属性,但这通常由SelectList
实例设置。否则,您必须自己手动设置此属性。由于您使用的是IEnumerable<SelectListItem>
而不是实例化的SelectList
,因此所有项目都应默认为Selected
为false。只有当Razor呈现DropDownListFor
控件时,您才能将可枚举变为实际SelectList
,并根据模型设置其选定值。检查您的其他代码,确保您没有在任何地方手动设置所选状态。
FWIW,您无需手动添加空项:DropDownListFor
控件可以将空项添加到列表中。
@Html.DropDownListFor(x => x.SelectedItem1, Model.PossibleItems, string.Empty)
答案 3 :(得分:0)
不使用# A tibble: 3 x 6
a b c a_prop b_prop c_prop
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 4 5 0.1 0.4 0.5
2 8 2 3 0.8 0.2 0.3
3 1 4 2 0.1 0.4 0.2
,而是使用List<SelectListItem>
。然后,您可以重复使用SelectList
中的项目列表。
<强>型号:强>
DropDownListFor
<强>控制器:强>
public SelectList PossibleItems { get; set; }
查看:强>
var items = new List<SelectListItem>();
model.PossibleItems = new SelectList(items, "Value", "Text");