我有这个“问题”,我在许多控制器操作中都有这样的代码:
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;
您如何将其重构为更清洁的解决方案?我想要干!
答案 0 :(得分: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);
答案 1 :(得分: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
}
答案 2 :(得分:0)
您可以将该逻辑放在(抽象)BaseController中,然后从中派生所有控制器并让它们调用BaseController中的方法以根据需要获取该数据。
如果您需要将它包含在 ALL 控制器操作中,您还可以将它放在BaseController中的重写OnActionExecuting()中。