如何使用AutoMapper将List映射到ASP.NET MVC中的SelectList?

cho*_*bo2 7 c# asp.net-mvc automapper

我有一个数据列表,我想绑定到我的ViewModel中的SelectList.

如何使用AutoMapper执行此操作?

Dar*_*rov 17

如果我们假设你有一个模型:

public class FooModel
{
    public int ModelId { get; set; }
    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在FooModel和之间有一个映射SelectListItem:

Mapper
    .CreateMap<FooModel, SelectListItem>()
    .ForMember(
        dest => dest.Value, opt => opt.MapFrom(src => src.ModelId.ToString())
    )
    .ForMember(
        dest => dest.Text, opt => opt.MapFrom(src => src.Description)
    );
Run Code Online (Sandbox Code Playgroud)

然后当你得到你的时候,IEnumerable<FooModel>你只需将其转换为IEnumerable<SelectListItem>:

IEnumerable<FooModel> models = ...
IEnumerable<SelectListItem> viewModels = Mapper
    .Map<IEnumerable<FooModel>, IEnumerable<SelectListItem>>(models);   
Run Code Online (Sandbox Code Playgroud)

更现实的例子是拥有以下视图模型:

public class MyViewModel
{
    public string SelectedItemId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以现在你的控制器动作可能如下所示:

public ActionResult Index()
{
    IEnumerable<FooModel> items = ...
    var viewModel = new MyViewModel
    {
        Items = Mapper.Map<IEnumerable<FooModel>, IEnumerable<SelectListItem>>(items)
    };
    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

在强类型视图中:

@Html.DropDownListFor(
    x => x.SelectedItemId, 
    new SelectList(Model.Items, "Value", "Text")
)
Run Code Online (Sandbox Code Playgroud)