如果在for循环中,DropDownListFor不选择值

时间:2010-04-13 16:40:33

标签: asp.net-mvc asp.net-mvc-2 drop-down-menu html-helper

在我看来

<%= Html.DropDownListFor( x => x.Countries[ i ], Model.CountryList )%>

在我的控制器中

public int[ ] Countries { get; set; }

public List<SelectListItem> CountryList { get; set; }

当表单发布时没有问题,填充下拉列表并发布用户选择的值。但是当我尝试将已经指定值的表单加载到Countries []时,它不会被选中。

6 个答案:

答案 0 :(得分:24)

不确定这是mv4的新功能还是先前版本中是否存在。但DropDownListFor包含SelectList构造函数的附加参数。

SelectList(IEnumerable, String, String, Object)

例如:

Html.DropDownListFor( x => x.Countries[ i ], New SelectList(Model.CountryList,"ID","Description",Model.Countries[i]))

其中IDCountryList对象中的国家/地区ID,Description是国家/地区名称。

答案 1 :(得分:10)

我也是这样。使用foreach循环DropDownListFor时(即在页面上呈现多个选择元素)。

我的工作是在控制器而不是视图中设置所选值:如下所示:

在控制器中:

public class FruitList 
{        
    public int? selectedFruit{ get; set; }
    public List<SelectListItem> fruits
    {
        get
        {
            fruitEntities F = new fruitEntities();
            List<SelectListItem> list = (from o in F.Options
                                         select new SelectListItem
                                         {
                                             Value = o.fruitID,
                                             Text = o.fruit,                                                 
                                             Selected = o.fruitID == selectedFruit
                                         }).ToList();
            return list;
        }
    }
}

public class ViewModel 
{              
    public List<FruitList> collectionOfFruitLists { get; set; }        
}

在视图中

<table>                        
   <% for (int i=0; i < Model.collectionOfFruitLists.Count; i++ )
        { %>
        <tr>                            
            <td><%: Html.DropDownList("fruitSelectList", collectionOfFruitLists[i].fruits, "Please select...") %></td>                
        </tr>
        <%} %>
 </table>

控制器中的nifty位为Selected = o.fruitID == selectedFruit,其作用类似于SQL CASE语句; Lance Fisher真的很好地解释了这一点(感谢兰斯,你的帖子真的帮助了我:)

答案 2 :(得分:6)

我知道这个问题有点陈旧,但我刚刚遇到这个问题,循环遍历一个对象列表,并尝试将这些值绑定到我的编辑视图中的DropDownListFor(。)

我通过使用其他人为此问题提供的一些先前解决方案的逻辑,克服了内联解决方案的问题。

绑定到我的模型:

@Html.DropDownListFor(model => model.QuestionActions[i].QuestionActionTypeId,
      Model.QuestionActionTypes.Select(x => new SelectListItem() { Value = x.Value, Text = x.Text, Selected = (x.Value == Model.QuestionActions[i].QuestionActionTypeId.ToString()) }).ToList(),
          "Select Action Type",
                 new { })

Model.QuestionActionTypes是一个在我的Controller中填充的SelectList。

答案 3 :(得分:0)

这有点像黑客,而且依赖JavaScript,但它对我来说非常好。

您需要知道字段将生成的客户端ID(通常这些可以手动计算,但为了安全起见,您可能希望使用类似FieldIDFor method的内容。

你只需要在jQuery的$(文档)中准备基于模型的值.ready:

<script type="text/javascript">
    $(document).ready(function () {
        @for(var i = 0; i < 5; i++)
        {
            <text>
                $("#@Html.FieldIDFor(m => m.Countries[i])").val("@Model.Countries[i]");
            </text>
        }
    });
</script>

答案 4 :(得分:-1)

选择框发送单个值,因此Countries属性不应该是数组。同样在你的帖子中,不清楚你在lambda表达式中使用的i变量来自何处,并且助手中使用的x.CountryList将无法编译,因为x未定义。

型号:

public class MyModel
{
    public int SelectedCountry { get; set; }
    public List<SelectListItem> CountryList { get; set; }
}

查看:

<%= Html.DropDownListFor(x => x.SelectedCountry, Model.CountryList) %>

更新:

根据评论,似乎有多个下降。我怀疑问题可能来自i循环中用作索引的for变量。

您可以尝试这样做:

型号:

public class MyModel
{
    public int[] Countries { get; set; }
    public List<SelectListItem> CountryList { get; set; }
}

查看:

<% foreach (var country in Model.Countries) { %>
    <%= Html.DropDownListFor(x => country, Model.CountryList) %>
<% } %>

答案 5 :(得分:-1)

不要在viewmodel中使用IEnumerable,而是使用像这样的对象List:

public List<PairVM<string,string>> TiposValorCobertura { get; private set; }

在您的视图中,当您在循环中为下拉列表分配可选元素时,请执行以下操作:

@Html.DropDownListFor(m => m.Coberturas[i].TipoLimiteInferior, new SelectList(Model.TiposValorCobertura,"Key","Description",  Model.Coberturas[i].TipoLimiteIferior))

其中“Key”和“Description”是PairVM的属性