在视图代码中设置下拉列表的选定项目

时间:2009-12-15 16:15:53

标签: asp.net-mvc

我在视图代码中创建了一个表单循环。在表单中,每个项目都有自己的下拉列表,它们都是从视图数据中共享的:

    <%foreach(Foo i in Model){ %>
    <tr>
        <td><%=i.title%></td>
        <td><%=Html.DropDownList("order"+i.id.ToString(), ViewData["SequenceDropDown"] as SelectList)%></td>
    </tr>
    <%} %>

我需要这样做才能使所选项目基于Foo(i.Sequence)的属性。我似乎无法找到办法做到这一点?

我可以在控制器中执行此操作,但我希望能够在所有项目中共享选择列表并相应地选择所选项目。

2 个答案:

答案 0 :(得分:1)

我认为您必须在操作中创建一个SelectItem列表数组,以正确识别每个实例的选定项目。然后,您可以从该阵列创建下拉列表。

这比在View中执行此操作更简洁,因为View应该尽可能地愚蠢。

答案 1 :(得分:0)

我写了一个快速流畅的扩展方法来做到这一点:

    public static IEnumerable<SelectListItem> WithSelected( this IEnumerable<SelectListItem> selectListItems, object selectedvalue )
    {
        var newItems = new List<SelectListItem>(selectListItems);

        foreach( var item in newItems )
            item.Selected = item.Value == selectedvalue.ToString();

        return newItems;
    }

    public static IEnumerable<CheckBoxItem> WithSelected(this IEnumerable<CheckBoxItem> selectListItems, int selectedvalue)
    {
        var newItems = new List<CheckBoxItem>(selectListItems);

        foreach (var item in newItems)
            item.Checked = item.Id == selectedvalue;

        return newItems;
    }

    public static IEnumerable<CheckBoxItem> WithSelected(this IEnumerable<CheckBoxItem> selectListItems, IEnumerable<int> selectedvalues)
    {
        var newItems = new List<CheckBoxItem>(selectListItems);

        foreach (var item in newItems)
            item.Checked = selectedvalues.Contains(item.Id);

        return newItems;
    }

我想可以通过吹风机,但它工作正常。用法如下:

<%foreach(Foo i in Model){ %>
<tr>
    <td><%=i.title%></td>
    <td><%=Html.DropDownList("order"+i.id.ToString(), (ViewData["SequenceDropDown"] as SelectList)).WithSelected(i.Sequence) %></td>
</tr>
<%} %>