Ste*_*aly 2 c# asp.net asp.net-mvc viewmodel automapper
问题
我目前正在为我的MVC项目添加自动化,而且我被卡住了.现在我有一个User模型用于表示数据库中的数据.我必须将该模型映射到EditUserModel,这将在调用Edit方法时使用.EditUserModel IEnumerable<SelectListItem>(对于下拉菜单)我似乎无法弄清楚如何映射.
试图解决方案
截至目前,我还没有尝试过任何事情.我不确定在哪里IEnumerable<SelectListItem>或哪里填充它的最佳位置.现在它正在控制器中填充.
User.cs
public class User
{
[Key]
public int UserID { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public int RoleID { get; set; }
[ForeignKey("RoleID")]
public virtual Role Role { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
EditUserModel.cs
public class EditUserViewModel
{
[HiddenInput(DisplayValue = false)]
public int UserID { get; set; }
[Required]
public String Username { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[DisplayName("Role")]
[Required]
public int RoleID { get; set; }
//The trouble field
public IEnumerable<SelectListItem> Roles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Controller.cs
EditUserViewModel model = new EditUserViewModel();
//Population of the dropdown menu
model.Roles = context.Roles
.ToList()
.Select(x => new SelectListItem
{
Text = x.Description,
Value = x.RoleID.ToString()
});
//Mapping that the automaper will take care of
model.UserID = user.UserID;
model.Username = user.Username;
model.RoleID = user.RoleID;
Run Code Online (Sandbox Code Playgroud)
为了记录,这是我在对Jakub的回答的评论中所说的:
public static class EnumerableExtensions
{
public static IEnumerable<SelectListItem> ToSelectList<T, TTextProperty, TValueProperty>(this IEnumerable<T> instance, Func<T, TTextProperty> text, Func<T, TValueProperty> value, Func<T, bool> selectedItem = null)
{
return instance.Select(t => new SelectListItem
{
Text = Convert.ToString(text(t)),
Value = Convert.ToString(value(t)),
Selected = selectedItem != null ? selectedItem(t) : false
});
}
}
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,这是非常简单并且完成同样的事情(并且在属性路径不简单的情况下实际上更加健壮,因为Jakub的解决方案不适用于嵌套属性).
(这不是一个真正的答案,我将它作为社区维基发布,只是为了帮助阐述一点)
| 归档时间: |
|
| 查看次数: |
2768 次 |
| 最近记录: |