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

时间:2014-09-30 11:11:09

标签: c# asp.net-mvc

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

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

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-property的值默认为&#34; 0&#34;对于每个条目。我尝试将枚举更改为字符串,并且每个条目的属性现在都为null。还尝试使用EditorTemplate,如此问题的答案所示:Binding each DropDownListFor within @foreach。但是,该属性仍为0或null。

当我在控制器中检索模型时,如何维护Color属性?

1 个答案:

答案 0 :(得分:1)

问题是DropDownListFor仅绑定到Amount属性。为了保持Color属性,我必须在DropDownlistFor

下添加它
@Html.HiddenFor(x => x.ColorList[i].Color)

在该行代码之后,为ColorList中的每个条目正确设置了Color-property。