使用扩展方法进行下拉
using extension method for dropdown
我目前正在开发一个具有创建和编辑视图的 MVC 应用程序。两种观点在 UI 方面非常相似。在每个页面上,我都有大约 5-7 个下拉菜单,我借助以下扩展方法将其填充到控制器中。
public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> items, Func<T, string> textSelector, Func<T, string> valueSelector)
{
return items.OrderBy(item => textSelector(item))
.Select(item =>
new SelectListItem
{
Text = textSelector(item),
Value = valueSelector(item)
});
}
现在在编辑视图中,我想显示相同的下拉菜单,但这次将所选值设置为 true,以适应用户在创建视图中选择的任何值。这就是我目前的做法
List<SelectListItem> userDdl = new List<SelectListItem>();
foreach (var items in GetUserDropDown(userId, userName))
{
userDdl.Add(new SelectListItem { Value = items.Value, Text = items.Text });
}
userDdl.Where(a => a.Value == someValueFromDb).First().Selected = true;
这行得通,但我在想是否有更好的方法来解决这个问题,或者我是否坚持这样做
我想出了一些办法。我为 ToSelectListItems
方法创建了一个重载,如下所示:
public static IEnumerable<SelectListItem> ToSelectListItems<T>(this List<T> items, Func<T, string> nameSelector, Func<T, string> valueSelector, Func<T, bool> selecter)
{
return items
.OrderBy(item => nameSelector(item))
.Select(item =>
new SelectListItem
{
Selected = selecter(item),
Text = nameSelector(item),
Value = valueSelector(item)
});
}
现在我可以做到:
List<SelectListItem> userDdl = GetUserDropDown(userId, userName).ToSelectListItems(a => a.UserName, a => a.UserId.ToString(), a => a.UserId.ToString() == userIdFromDb).ToList();
我目前正在开发一个具有创建和编辑视图的 MVC 应用程序。两种观点在 UI 方面非常相似。在每个页面上,我都有大约 5-7 个下拉菜单,我借助以下扩展方法将其填充到控制器中。
public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> items, Func<T, string> textSelector, Func<T, string> valueSelector)
{
return items.OrderBy(item => textSelector(item))
.Select(item =>
new SelectListItem
{
Text = textSelector(item),
Value = valueSelector(item)
});
}
现在在编辑视图中,我想显示相同的下拉菜单,但这次将所选值设置为 true,以适应用户在创建视图中选择的任何值。这就是我目前的做法
List<SelectListItem> userDdl = new List<SelectListItem>();
foreach (var items in GetUserDropDown(userId, userName))
{
userDdl.Add(new SelectListItem { Value = items.Value, Text = items.Text });
}
userDdl.Where(a => a.Value == someValueFromDb).First().Selected = true;
这行得通,但我在想是否有更好的方法来解决这个问题,或者我是否坚持这样做
我想出了一些办法。我为 ToSelectListItems
方法创建了一个重载,如下所示:
public static IEnumerable<SelectListItem> ToSelectListItems<T>(this List<T> items, Func<T, string> nameSelector, Func<T, string> valueSelector, Func<T, bool> selecter)
{
return items
.OrderBy(item => nameSelector(item))
.Select(item =>
new SelectListItem
{
Selected = selecter(item),
Text = nameSelector(item),
Value = valueSelector(item)
});
}
现在我可以做到:
List<SelectListItem> userDdl = GetUserDropDown(userId, userName).ToSelectListItems(a => a.UserName, a => a.UserId.ToString(), a => a.UserId.ToString() == userIdFromDb).ToList();