如何将多个列表值传入ViewModel并完成Master模型属性正确赋值
代码修正方案
你现有代码存在3个会直接导致编译/运行失败的问题:
Table1类重复定义了同名属性sample1,属于笔误,第二个属性应为sample2- 实例化
Master对象后未初始化内部的T1、T2集合属性,直接访问会抛出空引用异常 - 遍历逻辑完全错误:你写的
foreach(var row in T1)中T1既没有初始化也没有数据源,且双层循环的逻辑倒置——应该从数据库查询结果生成对应实体,再加入主模型的集合,而非遍历空集合嵌套数据库结果。
修正后的Model定义
// 主ViewModel(Master主模型) public class Master { // 直接初始化集合,从根源避免空引用异常 public List<Table1> T1 { get; set; } = new List<Table1>(); public List<Table2> T2 { get; set; } = new List<Table2>(); } public class Table1 { // 修正重复的属性名 public string sample1 { get; set; } public string sample2 { get; set; } } public class Table2 { public string sample1 { get; set; } public string sample2 { get; set; } }
修正后的控制器赋值逻辑
不需要双层循环,直接遍历数据库查询结果,逐个生成对应实体加入主模型的集合即可:
public IActionResult DemoAction() { // 实例化主ViewModel Master master = new Master(); // 查询数据库数据,加ToList()一次性把数据拉到内存 var getSamples = _db.dbSamples.Where(y => y.sample == "xxxx").ToList(); // 遍历查询结果,映射为Table1对象加入T1集合 foreach (var item in getSamples) { master.T1.Add(new Table1 { sample1 = item.A, sample2 = item.B }); } // T2赋值逻辑完全一致,查询对应数据源后映射加入master.T2即可 // 示例: // var getT2Source = _db.Table2Source.Where(xxx).ToList(); // foreach(var item in getT2Source) // { // master.T2.Add(new Table2{ sample1 = item.Field1, sample2 = item.Field2 }); // } return View(master); }
视图中使用ViewModel的方式
之前用ViewData需要手动拆箱转类型,用强类型ViewModel只需要在视图最顶部声明模型类型,之后可以直接通过Model访问属性:
<!-- 替换为你自己项目下Master类的实际命名空间 --> @model YourProjectName.Models.Master <h3>T1列表数据</h3> @foreach(var row in Model.T1) { <div>sample1:@row.sample1,sample2:@row.sample2</div> } <h3>T2列表数据</h3> @foreach(var row in Model.T2) { <div>sample1:@row.sample1,sample2:@row.sample2</div> }
内容的提问来源于stack exchange,提问作者Veck
相关产品推荐
相关产品推荐

