我在视图代码中创建了一个表单循环。在表单中,每个项目都有自己的下拉列表,它们都是从视图数据中共享的:
<%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)的属性。我似乎无法找到办法做到这一点?
我可以在控制器中执行此操作,但我希望能够在所有项目中共享选择列表并相应地选择所选项目。
答案 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>
<%} %>