如何使用foreach循环创建多个DropDownListFor

本文关键字:DropDownListFor 创建 循环 何使用 foreach | 更新日期: 2023-09-27 18:25:01

我有一个自定义对象的列表,我想为列表中的每个对象创建一个下拉列表。

我的模型的相关部分如下:

public class ColorModel
{    
    public enum Colors
    {
        Blue,
        Red,
        Yellow,
        Green,
        Purple
    }
    public Dictionary<string, int> Quantities
    {
        get
        {
            return new Dictionary<string, int>()
            {
                {"0", 0},
                {"1", 1},
                {"2", 2},
                {"3", 3},
                {"4", 4}
            };
        }
    }
    public List<AmountPerColor> ColorList { get; set; }
    public class AmountPerColor
    {
        public Colors Color { get; set; }
        public int Amount { get; set; }
    }
}

ColorList启动为:

colorModel.ColorList = new List<ColorModel.AmountPerColor>()
{   
    new ColorModel.AmountPerColor() {Color = ColorModel.Colors.Blue, Amount = 4},
    new ColorModel.AmountPerColor() {Color = ColorModel.Colors.Red, Amount = 1},
    new ColorModel.AmountPerColor() {Color = ColorModel.Colors.Yellow, Amount = 0},
    new ColorModel.AmountPerColor() {Color = ColorModel.Colors.Green, Amount = 2},
    new ColorModel.AmountPerColor() {Color = ColorModel.Colors.Purple, Amount = 0}
};

视图:

@{ var i = 0; }
@foreach (var color in Model.ColorList)
{
    <label>@color.Color</label>
    @Html.DropDownListFor(x => x.ColorList[i].Amount, new SelectList(Model.Quantities, "key", "value", Model.ColorList[i].Amount), new { @name = @color.Color, @id = @color.Color })
    i++;
}

这与一些其他参数一起封装在Html.BeginForm中,并发送到以下控制器方法:

public ActionResult Action(ColorModel colorModel)
{
    //do controller stuff
}

问题是在控制器中,colorList按正确的顺序具有正确的数量,每个条目的Color属性值默认为"0"。我尝试将enum改为字符串,现在每个条目的属性都为null。还尝试使用EditorTemplate,正如这个问题的答案所建议的那样:在@foreach中绑定每个DropDownListFor。但是,该属性仍然为0或null。

在控制器中检索模型时,如何维护"颜色"属性?

如何使用foreach循环创建多个DropDownListFor

问题是DropDownListFor只绑定到Amount属性。为了保留Color属性,我不得不将其添加到DropDownlistFor 下

@Html.HiddenFor(x => x.ColorList[i].Color)

在这行代码之后,为ColorList中的每个条目正确设置了Color属性。