Automapper - 将字符串属性转换为SelectList?

时间:2013-05-14 18:26:39

标签: c# asp.net-mvc automapper

我刚开始在MVC项目中学习AutoMapper。我有一个基本实体“Attendee”,其中包含Gender字符串字段(可能的值为“M”或“F”)。

我已经在我的参加者和我的AttendeeEditView对象之间创建了一个基本映射。我想要做的是将模型侧的“M”或“F”性别字符串转换为ViewModel侧的SelectList,并在列表中选择适当的值。

我想我需要一个ValueResolver才能做到这一点......这就是我写的:

public class GenderMenuResolver : ValueResolver<Attendee, SelectList> {
    protected override SelectList ResolveCore( Attendee source ) {
        List<object> items = new List<object>(){
            new{ Value = "F" , Text = "Female" },
            new{ Value = "M" , Text = "Male" }
        };

        string Gender = source.Gender ?? "";
        string selectedValue = new List<string>() { "M", "F" }.Contains( Gender.ToUpper() ) ? Gender.ToUpper() : "";

        SelectList GenderMenu = new SelectList(
            items,
            "Value",
            "Text",
            selectedValue
        );

        return GenderMenu;
    }
}

我的映射代码:

Mapper.CreateMap<Attendee, AttendeeEditView>()
.ForMember( dest => dest.Gender, opt => opt.ResolveUsing<GenderMenuResolver>() );


List<AttendeeEditView> ViewModel = Mapper.Map<List<AttendeeEditView>>( Attendees );

单步执行我可以看到此代码执行并输出正确的选择列表。但是,我收到以下错误:

  

映射类型:SelectList - &gt; SelectList System.Web.Mvc.SelectList - &gt;   System.Web.Mvc.SelectList

     

目的地路径:列出`1 [0] .Gender.Gender

     

源值:System.Web.Mvc.SelectList

首先,“。Gender.Gender”映射似乎不正确。

但根本问题似乎是......一条内部异常消息揭示了这一点:

  

“Type'System.Web.Mvc.SelectList'没有默认构造函数”

任何人都可以帮我识别我做错了什么,或者我应该使用更好的方法吗?感谢。

1 个答案:

答案 0 :(得分:12)

我认为你让它变得比它需要的更难。并非所有内容都需要映射,事实上SelectList之类的内容几乎肯定不应该映射,因为它们只与视图模型相关,而不是模型。

因此,在您的视图模型中,只需执行以下操作:

public string Gender { get; set; }

public SelectList GenderChoices
{
    get
    {
        return new SelectList(new List<SelectListItem>
            {
                new SelectListItem { Value = "M", Text = "Male" },
                new SelectListItem { Value = "F", Text = "Female" }
            }, "Value", "Text", Gender);
    }
 }

Gender映射到哪里,但GenderChoices只会存在于您的视图模型中。

然后,在您看来:

@Html.DropDownListFor(m => m.Gender, Model.GenderChoices)