1

我有这个“问题”,我在我的许多控制器操作中都有这样的代码:

var users = new List<SelectListItem>();
foreach(var user in userRepository.GetAll())
{
 var item = new SelectListItem { Text = user.FriendlyName, Value = user.UserId.ToString() };

 if (User.Identity.Name == user.UserName)
  item.Selected = true;

 users.Add(item);
}

ViewData["Users"] = users;

您将如何将其重构为更干净的解决方案?我想干!

4

3 回答 3

2

我会将其创建为应用于List<user>或任何您的 userRepository.GetAll() 返回的扩展方法,因此在您的代码中您可以将所有这些用法替换为

ViewData["Users"] = userRepository.GetAll().ToSelectList();

编辑代码示例:有两种方法可以做到这一点

public static List<SelectListItem> ToSelectList(this List<Agent> users)
{
    List<SelectListItem> items = new List<int>();
    foreach (var user in users)
    {
        var item = new SelectListItem { Text = user.FriendlyName, 
                                Value = user.UserId.ToString() };

        if (User.Identity.Name == user.UserName)
            item.Selected = true;

        items.Add(item);
    }

    return items;
}

用法就像

userRepository.GetAll().ToSelectList();

或者,如果您在扩展方法中遇到身份问题

public static List<SelectListItem> ToSelectList(this List<Agent> users, 
                                                        string selectedUserName)
{
    List<SelectListItem> items = new List<int>();
    foreach (var user in users)
    {
        var item = new SelectListItem { Text = user.FriendlyName, 
                                Value = user.UserId.ToString() };

        if (user.UserName == selectedUserName)
            item.Selected = true;

        items.Add(item);
    }

    return items;
}

用法就像

userRepository.GetAll().ToSelectList(User.Identity.Name);
于 2009-09-23T13:46:19.210 回答
1

将该代码或部分代码放入一个单独的类中——我们称之为 UserService。让 UserService 实现 IUserService:

public interface IUserService
{
    IEnumerable<SelectListItem> GetUsers();
}

通过构造函数注入将 IUserService 注入控制器:

public MyController(IUserService userService)
{
    this.userService = userService;
}

使用userService控制器操作中的字段来获取用户。

public ViewResult DoSomething()
{
    var users = this.userService.GetUsers();
    // the rest of the implementation
}
于 2009-09-23T13:47:21.860 回答
0

您可以将该逻辑放在(抽象)BaseController 中,然后从中派生所有控制器,并让它们调用 BaseController 中的方法以根据需要获取该数据。

如果您需要将它包含在您的所有控制器操作中,您还可以将其放置在 BaseController 中的重写 OnActionExecuting() 中。

于 2009-09-23T13:43:27.173 回答