【问题标题】:Automapper - Convert string property to SelectList?Automapper - 将字符串属性转换为 SelectList?
【发布时间】:2013-05-14 18:26:39
【问题描述】:

我刚刚开始在 MVC 项目中学习 AutoMapper。我有一个带有性别字符串字段的基本实体“参加者”(“M”或“F”的可能值)。

我已经在我的 Attendee 和我的 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 -> SelectList System.Web.Mvc.SelectList -> System.Web.Mvc.SelectList

目标路径:List`1[0].Gender.Gender

源值:System.Web.Mvc.SelectList

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

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

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

谁能帮我找出我做错了什么,或者我应该使用更好的方法吗?谢谢。

【问题讨论】:

    标签: c# asp.net-mvc automapper


    【解决方案1】:

    我认为你让这变得比它需要的更困难。并不是所有的东西都需要映射,事实上像SelectLists 这样的东西几乎肯定不应该被映射,因为它们只与视图模型相关,而不是模型。

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

    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)
    

    【讨论】:

    • 我喜欢这个......我对使用 ViewModels 也很陌生,所以我很欣赏这种洞察力。我试试看。
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多