在Razor视图中显示含多模型列表的ViewModel数据遇问题
问题分析与解决方案
嘿,我一眼就瞅出问题所在了——你把集合类型和单个对象搞混啦!
核心问题拆解
你的MyBigViewModel里,FirstModel是List<FirstModel>类型(也就是一个列表集合),但在Razor视图里你直接写@Html.DisplayFor(modelItem => item.FirstModel.Name),相当于试图给一个「列表对象」找Name属性——可列表本身根本没有这个属性啊!只有列表里的每一个FirstModel实例才会有Name。
下面给你两种解决方案,根据你的实际业务需求选就行:
方案1:如果每个MyBigViewModel只对应一个FirstModel实例
这应该是最符合你填充逻辑的场景——你是遍历FirstModelList里的单个SingleModel,再关联其他模型,那MyBigViewModel里的FirstModel就不该是列表,应该是单个对象。
- 先修改
MyBigViewModel的定义:
public class MyBigViewModel { public FirstModel FirstModel { get; set; } // 去掉List<>,改成单个对象 public List<SecondModel> SecondModel { get; set; } public List<ThirdModel> ThirdModel { get; set; } public List<FourthModel> FourthModel { get; set; } public List<FifthModel> FifthModel { get; set; } }
- 修正填充逻辑里的赋值(顺便提一句,原代码里对象初始化器用了分号,这是语法错误,要改成逗号):
List<MyBigViewModel> BigViewModel = new List<MyBigViewModel>(); foreach (var singleModel in FirstModelList) { var secondModelResult = db.somequery; var thirdModelResult = db.somequery; var fourthModelResult = db.somequery; var fifthModelResult = db.somequery; MyBigViewModel tempViewModel = new MyBigViewModel{ FirstModel = singleModel, // 直接赋值单个FirstModel实例 SecondModel = secondModelResult, ThirdModel = thirdModelResult, FourthModel = fourthModelResult, FifthModel = fifthModelResult }; BigViewModel.Add(tempViewModel); }
- 这时候视图里的访问就完全正常了:
@foreach (var item in Model) { @Html.DisplayFor(modelItem => item.FirstModel.Name) }
方案2:如果每个MyBigViewModel确实需要包含多个FirstModel实例
那你得在视图里做嵌套遍历,先遍历外层的大模型列表,再遍历每个大模型里的FirstModel集合:
@foreach (var bigItem in Model) { <div> <h4>当前大模型对应的FirstModel列表:</h4> @foreach (var firstItem in bigItem.FirstModel) { <p>@Html.DisplayFor(modelItem => firstItem.Name)</p> } </div> }
内容的提问来源于stack exchange,提问作者smned
相关产品推荐
相关产品推荐

