c# - 带有另一个 ViewModel 集合的 ViewModel - AutoMapper 可以帮助我吗?

标签 c# linq asp.net-mvc-3 viewmodel automapper

我有一个如下所示的 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/

相关文章:

c# - System.Drawing.dll 中出现“System.ArgumentException”

c# - 查询以检索组节点的名称

c# - C# Linq 中的多级包含

asp.net-mvc-3 - t4mvc,无法解析符号 "MVC"

C# Entity Framework - 初学者

c# - 更好的求和方式

c# - 如果 API 速率限制超过使用 WebApiThrottle - C# Web API,则阻止 API 请求 5 分钟

linq选择m :n user:groups

asp.net-mvc-3 - Facebook 身份验证和奇怪的重定向行为

asp.net-mvc - 自定义 WIF 请求验证器无限循环