我有一个如下所示的 ViewModel:
public class CreateReviewViewModel
{
public string Title { get; set; }
public decimal Score { get; set; }
public ICollection<RecommendationViewModel> Recommendations { get; set; }
}
因此,前两个是基本的原生类型 - 简单。
第三个属性是另一个 ViewModel 的集合:
public class RecommendationViewModel
{
public RecommendationType RecommendationType { get; set; }
public bool IsRecommendedFor { get; set; }
}
RecommendationType
是我的领域模型中的一个enum
,它具有代表不同“推荐”的byte
值。
在我的[HttpGet]
操作中,我这样做:
var model = new CreateReviewViewModel
{
Recommendations = SomeMethodWhichLoopsThroughTheEnumMembersAndCreatesTheModel();
}
return View(model);
所以我最终得到了一个 RecommendationViewModel
列表,其中 bool
属性设置为 false
。
然后在我的 View 中,我使用 EditorTemplates:
@Html.EditorFor(model => model.Recommendations)
它调用自定义编辑器模板,为这两个属性呈现标签和复选框。很酷。
所以 - 这是背景,希望它有意义。
如何将该 ViewModel 映射到 [HttpPost]
操作中的 Review
域模型?
Review
对象的部分如下所示:
public class Review
{
public bool IsRecommendedForA { get; set; }
public bool IsRecommendedForB { get; set; }
// etc
}
我目前正在做这样的自定义映射:
var review = new Review();
review.IsRecommendedForA = this.Recommendations.SingleOrDefault(x => x.RecommendationType == RecommendationType.A).IsRecommendedFor;
review.IsRecommendedForB = this.Recommendations.SingleOrDefault(x => x.RecommendationType == RecommendationType.B).IsRecommendedFor;
这很乏味。
我可以使用 AutoMapper 执行上述操作吗?
当然,我可以只是将所有不同的 RecommendationType 作为基本属性添加到 ViewModel 而不是一个集合,但是我的 View 变得复杂了,我不能使用 EditorTemplates 来隐式循环集合 - 我必须为每个属性写出 Html.EditorFor
。
有什么想法吗?
最佳答案
我有一个可能的解决方案:
Mapper.CreateMap<CreateReviewViewModel, Review>()
.ForMember(dest => dest.IsRecommendedForA, opt => opt.MapFrom(src => src.IsRecommendedFor(RecommendationType.A)))
.ForMember(dest => dest.IsRecommendedForB, opt => opt.MapFrom(src => src.IsRecommendedFor(RecommendationType.B)));
其中 IsRecommendedFor
是一个钩子(Hook)属性,使用我的问题前面提到的 LINQ 表达式来计算模型是否包含该属性,并检查它。
这比手动从左到右更好,但仍然不是很好。
我看过自定义转换器/解析器,但没有一个接受额外的参数(例如,从这个解析到这个,也使用这个参数),所以我看不出如何使用它们。
我现在就这样做,但希望有人知道如何做得更好。
关于c# - 带有另一个 ViewModel 集合的 ViewModel - AutoMapper 可以帮助我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454262/