AutoMapper 将 Enum 映射到 SelectList - 所选值不起作用
AutoMapper map Enum to SelectList - Selected value not working
我创建了一个映射,它使用 ITypeConverter 的自定义实现将枚举转换为 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>()
));
除了 SelectListItem
的 Selected
值没有保持其值这一事实外,一切似乎都很好。我已经能够进入代码并且 SelectListItem
sli1
它已正确创建,所选值等于 true
.
然而,当我在映射后检查该值时,该值始终是 false
,正如您从以下屏幕截图中看到的那样。
这段代码我哪里错了?
问题出在您创建 select 列表时:
SelectList sl = new SelectList( items, "Value", "Text", pdm);
您将 selected 项目作为 ProductDeliveryMode
类型的 pdm
传递,它正在与 Value
属性 类型的 Value
进行比较=14=]。
根据您在下面的评论,解决方案是将 pdm
作为字符串传递。
我创建了一个映射,它使用 ITypeConverter 的自定义实现将枚举转换为 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>()
));
除了 SelectListItem
的 Selected
值没有保持其值这一事实外,一切似乎都很好。我已经能够进入代码并且 SelectListItem
sli1
它已正确创建,所选值等于 true
.
然而,当我在映射后检查该值时,该值始终是 false
,正如您从以下屏幕截图中看到的那样。
这段代码我哪里错了?
问题出在您创建 select 列表时:
SelectList sl = new SelectList( items, "Value", "Text", pdm);
您将 selected 项目作为 ProductDeliveryMode
类型的 pdm
传递,它正在与 Value
属性 类型的 Value
进行比较=14=]。
根据您在下面的评论,解决方案是将 pdm
作为字符串传递。