You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者携褉芯褋谢邪胁 袩褉芯褏芯褉芯胁

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:40