使用扩展方法进行下拉

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();