来自1 List <selectlistitem> </selectlistitem>的MVC Multiple DropDownLists

时间:2013-09-18 19:28:00

标签: c# asp.net-mvc asp.net-mvc-4 html.dropdownlistfor

后台:我的页面上有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)

4 个答案:

答案 0 :(得分:3)

2年前,但对于任何发现这一点的人来说,我确实在寻找答案Feussy上面的评论是要走的路。我会试着解释为什么和我找到的东西。

使用上面的OP示例。必须满足几个条件才能看到所描述的行为。

  • x.SelectedItem1应该有一个值(比如1)。
  • x.SelectedItem2必须为NULL。 (如果它不是可以为空的类型而且 只要说一个INT就会默认为0,你就看不到了 行为)

@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)

  • 如果x.SelectedItem2有一个值,它将设置它,你会没事的 但....
  • 如果x.SelectedItem2为null,则第二个@Html.DropDownListFor 似乎采取了改变(由第一个DropDownListFor)选择列表作为 是和你的第二次下拉将选择x.SelectedItem1。 (因为选择列表本身已被更改)

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");