动态创建的DropDownList上的模型绑定

时间:2014-01-31 11:14:59

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

型号1:

public class Model1
        {
            public int Id { get; set; }  
            public int VariantId { get; set; }
            public string Name { get; set; }    
            public string Language { get; set; }
            public IList<Model2>  ListModel2{ get; set; }   

            public VmSysVariantResource()
            {              
                ListModel2=new List<Model2>();    
            }
        }

模型2:

public class Model2
    {
        public int Id { get; set; }
        public int ParamterId { get; set; }
        public int ValueId { get; set; }
        [Required]
        public string SelectedValue { get; set; }
        public string ParameterName { get; set; }
        public IList<PossibleValue> Values { get; set; }

        public IList<SelectListItem> ValuesSelectListItem
        {
            get
            {

                var list = (from item in Values
                            select new SelectListItem()
                            {
                                Text = item.ValueName,
                                Value = item.Id
                            }).ToList();
                return list;
            }
            set { }
        } 

    } 

PossibleValue:

 public class PossibleValue
    {
        public int Id { get; set; }
        public string ValueName { get; set; }  

    }

现在解释一下我想做什么: 假设我们有一个模型“Model1”。该模型具有Model2列表。 Model2包含ParameterName和possibleValues列表。 现在我有这样的形式:

 @using (Ajax.BeginForm("Action", "Controller", null,
        new AjaxOptions
        {
            HttpMethod = "POST"
        }))
    {

        <table class="sample" style="margin: 0 auto; width: 400px">
            <tr>
                <td>
                    @Resource.Name:
                </td>
                <td>    @Html.TextBoxFor(c => c.Name) 
                </td>
            </tr>            

            @foreach (var item in Model.ParamtersToValue)
            {
                <tr>
                    <td>
                        @item.Parameter:
                    </td>
                    <td>
                        @Html.DropDownList("ParamtersToValue", @item.ValuesSelectListItem)
                    </td>
                </tr>
            }
        </table>
        <input type="submit" value="Submit"/>

    }

在控制器中的post方法中,我想获得带有ListModel2列表的Model1。 这是我的帖子方法:

[HttpPost]
        public ActionResult MyAction(Model1 obj)
        {  }

我应该使用ListModel2获取post方法Model1,它将包含从下拉列表中选择的SelectedValue,但我不知道如何在foreach块中构建下拉列表以强制模型绑定工作。 任何建议将不胜感激。谢谢..

1 个答案:

答案 0 :(得分:0)

默认模型绑定器适用于索引。因此,要使模型绑定,请将foreach循环更改为for循环,并使用索引渲染控件。像这样:

@for (int i = 0; i < Model.ParamtersToValue.Count; i++) {
    @* .. stuff here *@

    <td>
        @Html.DropDownListFor(x => Model.ParametersToValue[i], Model.ParametersToValue[i].ValuesSelectListItem)
    </td>

    @* .. stuff here *@
}

这将导致元素名称,例如[0].ParametersToValue[1].ParametersToValue等。模型绑定器将按照出现的顺序将它们绑定到您选择的可枚举中。