2015-04-04 55 views
0

我已经创建了一个映射,它通过使用ITypeConverter的自定义实现将enum转换为SelectList。AutoMapper地图枚举为SelectList - 选定的值不起作用

public class DeliveryModeToSelectListTypeConverter : ITypeConverter<ProductDeliveryMode, SelectList> 
{ 
    public SelectList Convert(ResolutionContext context) { 
     ProductDeliveryMode pdm = (ProductDeliveryMode)context.SourceValue; 
     List<SelectListItem> items = new List<SelectListItem>(); 
     SelectListItem sli1 = new SelectListItem() { 
      Text = StringEnum.GetStringValue(ProductDeliveryMode.DeliveryModeActivationByPin), 
      Value = ((int)ProductDeliveryMode.DeliveryModeActivationByPin).ToString(), 
      Selected = (pdm == ProductDeliveryMode.DeliveryModeActivationByPin) 
     }; 
     items.Add(sli1); 

     [...other enum members here...] 

     SelectList sl = new SelectList(items, "Value", "Text", pdm); 
     return sl; 
    } 
} 

然后我以

Mapper.CreateMap<ProductDeliveryMode, SelectList>() 
     .ConvertUsing(new DeliveryModeToSelectListTypeConverter()); 
Mapper.CreateMap<Product, ProductViewModel>() 
    .ForMember(p => p.DeliveryModeOptions, opt => opt.MapFrom(x => x.DeliveryMode)) 
    [...other members here...] 
    .Include<ExperienceProduct, ExperienceProductViewModel>(); 
Mapper.CreateMap<ExperienceProduct, ExperienceProductViewModel>() 
    .IncludeBase<Product, ProductViewModel>() 
)); 

一切创造了一个地图,似乎除了工作从事实SelectListItemSelected值不保持其价值很不错。我已经能够进入代码和SelectListItemsli1它正确地创建与选定的值等于true

Value when mapping

然而,当我在一个映射后检查该值的值总是false,你可以从下面的截图看到。

Value after mapping

在哪里我错了,与此代码?

回答

1

问题是,当你创建的选择列表:

SelectList sl = new SelectList(items, "Value", "Text", pdm); 

你传递所选择的项目为ProductDeliveryMode类型,正在对stringValue财产相比pdm

从您的评论下面,解决方案是通过pdm作为一个字符串。

+0

那么,你的建议没有奏效。但实际上让我思考差异。当我传递内联类型为'ProductDeliveryMode'的'pdm'而'SelectListItem'对象的'Value'成员是string类型时。我将它转换为字符串后传递了'pdm'对象。和一切都工作!如果你纠正你的答案,我会很高兴接受它。谢谢。 – Lorenzo 2015-04-04 21:04:11

+0

哦,太棒了,我并不确定SelectList是如何在幕后工作的,但是'pdm'的不同类型使我很怀疑。我会更新答案。 – mfanto 2015-04-04 21:07:11