Asp.net mvc 在视图代码中设置下拉列表的选定项

Asp.net mvc 在视图代码中设置下拉列表的选定项,asp.net-mvc,Asp.net Mvc,在我的视图代码中有一个创建表单的循环。在表单中,每个项目都有自己的下拉列表,它们都从视图数据中共享该列表: <%foreach(Foo i in Model){ %> <tr> <td><%=i.title%></td> <td><%=Html.DropDownList("order"+i.id.ToString(), ViewData["SequenceDropDown

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

    <%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)属性。我似乎找不到一个方法来做这件事


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

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


这将是一个比在视图中执行此操作更干净的实现,因为视图被认为是尽可能愚蠢的。

我编写了一个快速流畅的扩展方法来完成此操作:

    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;
    }
public static IEnumerable with selected(此IEnumerable selectListItems,对象selectedvalue)
{
var newItems=新列表(selectListItems);
foreach(newItems中的var项)
item.Selected=item.Value==selectedvalue.ToString();
返回新项目;
}
公共静态IEnumerable with selected(此IEnumerable selectListItems,int selectedvalue)
{
var newItems=新列表(selectListItems);
foreach(newItems中的var项)
item.Checked=item.Id==selectedvalue;
返回新项目;
}
公共静态IEnumerable with selected(此IEnumerable selectListItems,IEnumerable selectedvalues)
{
var newItems=新列表(selectListItems);
foreach(newItems中的var项)
item.Checked=selectedvalues.Contains(item.Id);
返回新项目;
}
我想可以用烘干机,但效果很好。用法类似于:

<%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>
<%} %>


是的,但是视图必须根据项目的内容在视图数据中选择正确的项目。对我来说,这会使代码更加笨拙,当然也不会使视图变得愚蠢。当您在操作中创建SelectList时,您将在中定义所选项目,然后视图所要做的就是遍历选择列表的ViewData数组(与您的模型迭代器同步)并实例化下拉列表。理想情况下,您可以扩展Foo对象以包括SelectList对象,或者使用一个中间对象在此上下文中显示Foo。您当然不必这样做,但它确实可以使视图更易于阅读。