gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:25 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com