ASP Core中如何在模型中配置List并赋值生成MasterDetail的JsonResult
解决字段初始化器无法访问实例属性的问题
嘿,这个问题我之前踩过坑!你遇到的错误是因为C#的字段初始化器执行时机在类的构造函数之前——这时候List1的实例还没完全创建,Login这类非静态实例属性还处于未初始化状态,编译器不允许你在字段初始化逻辑里直接访问它们,所以用Login给Test.Name赋值会报错,而用字符串常量"Test2"就没问题。
下面给你几个可行的解决方案,根据你的业务场景选就行:
方案1:用构造函数初始化List
把Test列表的初始化逻辑移到类的构造函数里,构造函数执行时实例已经创建完成,就可以正常访问Login属性了:
public class List1 { public int Id { get; set; } public string FirstName { get; set; } public string SecondName { get; set; } public string Login { get; set; } [NotMapped] public List<Test> Test { get; set; } // 构造函数中初始化列表 public List1() { Test = new List<Test> { new Test() { Name = Login, Age = "Age1" }, new Test() { Name = "Test2", Age = "Age2" } }; } } public class Test { public string Name { get; set; } public string Age { get; set; } }
注意:如果Login是在实例创建之后才赋值的(比如从数据库读取后设置),那这个方案里Test[0].Name会是null,这时候可以看方案2。
方案2:在Login赋值时同步更新Test列表
如果Login是后续动态赋值的,可以给Login加一个setter,在属性值变化时自动更新Test列表里的对应项:
public class List1 { public int Id { get; set; } public string FirstName { get; set; } public string SecondName { get; set; } private string _login; public string Login { get => _login; set { _login = value; // 当Login赋值时,更新Test列表的第一个元素的Name if (Test != null && Test.Any()) { Test[0].Name = value; } } } [NotMapped] public List<Test> Test { get; set; } = new List<Test> { new Test() { Age = "Age1" }, // 先不设置Name,等Login赋值后同步 new Test() { Name = "Test2", Age = "Age2" } }; }
方案3:在返回JsonResult前手动赋值
如果只是在生成JsonResult的场景下需要这个关联,也可以在控制器里手动给Test[0].Name赋值,灵活性更高:
// 假设这是你的控制器方法 public IActionResult GetList1() { var list1 = new List1 { Login = "your-login-value", // 其他属性赋值... }; // 手动把Login赋值给Test列表的第一个项 list1.Test[0].Name = list1.Login; return Json(list1); }
核心思路就是避开字段初始化器的限制,等到实例属性可以被访问的时候再进行赋值操作~
内容的提问来源于stack exchange,提问作者携褉芯褋谢邪胁 袩褉芯褏芯褉芯胁
相关产品推荐
相关产品推荐

