嵌套IEnumerable类型ViewModel使用LINQ赋值时隐式转换报错如何解决
错误根因
bvm属性定义为IEnumerable<BlogViewModel>,是可枚举的BlogViewModel集合类型,但你在赋值时直接传入了单个BlogViewModel实例,二者类型不匹配所以触发隐式转换失败报错。
方案1:快速修复(直接满足类型要求)
如果业务逻辑确实要把每个查询到的单条博客作为集合的唯一元素,只需要把单个对象包装成集合即可,修改赋值代码:
bvm = new List<BlogViewModel> { new BlogViewModel { // 你的BlogViewModel字段赋值逻辑 blogID = b.blogID, blogTitle = b.blogTitle, blogContent = b.blogContent, userID = a.Id, publishedDate = b.publishedDate, firstName = a.firstName, lastName = a.lastName } }
也可以用Enumerable.Repeat实现同样效果:
bvm = Enumerable.Repeat(new BlogViewModel{ /* 赋值逻辑 */ }, 1)
方案2:更符合业务设计的优化方案(推荐)
你的BlogCommentCombinedViewModel设计目的是整个页面只需要一个实例:包含全部博客列表+一个空的评论提交表单,原来的LINQ写法会为每条博客生成一个独立的组合视图模型实例,不符合设计初衷,调整控制器逻辑如下:
// 第一步:查询所有博客数据,转换为BlogViewModel集合 var blogList = from a in _db.Users join b in _db.blog on a.Id equals b.userID select new BlogViewModel { blogID = b.blogID, blogTitle = b.blogTitle, blogContent = b.blogContent, userID = a.Id, publishedDate = b.publishedDate, firstName = a.firstName, lastName = a.lastName }; // 第二步:生成唯一的组合视图模型实例 var combinedModel = new BlogCommentCombinedViewModel { bvm = blogList.ToList(), // 直接把查询到的整个博客集合赋值给bvm lcvm = new LeaveCommentViewModel() // 初始化空的评论表单模型供视图绑定 }; // 第三步:把组合模型传给视图即可 return View(combinedModel);
该方案优势:
- 完全匹配最初的视图模型设计,Razor页面直接用
@Model.bvm遍历所有博客,@Model.lcvm绑定评论提交表单 - 无冗余模型实例,逻辑清晰,后续维护成本低
内容的提问来源于stack exchange,提问作者Matt R
相关产品推荐
相关产品推荐

