C#-模型总是获取其默认值

C#-模型总是获取其默认值,c#,asp.net-core-webapi,asp.net-core-2.1,modelbinders,C#,Asp.net Core Webapi,Asp.net Core 2.1,Modelbinders,我有一个ASP.Net Core 2.1应用程序 下面是我的DTO public class Movie { public int Id { get; set;} public bool IsSpecial {get; set;} public IEnumerable<Ticket> Tickets { get; set; } public Movie() { if(IsSpecial) { t

我有一个
ASP.Net Core 2.1
应用程序

下面是我的DTO

public class Movie
{
  public int Id { get; set;}

  public bool IsSpecial {get; set;}

  public IEnumerable<Ticket> Tickets { get; set; }

    public Movie()
    {
        if(IsSpecial)
        {
            this.Tickets = new List<TicketSpecial>();
        }
        else
        {
            this.Tickets = new List<Ticket>();
        }
    }}}
TicketsSpecial(子类/派生类)

WebAPI控制器

public class MovieController : ControllerBase
{

  public IActionResult Post([FromBody]Movie movie)
  {
  }
}
邮递员(HTTPPost-Req有效负载
Content-Type=application/json

当我通过Postman&debug在Movie-ctor调用上述API时,它总是捕获
IsSpecial=false
&所有字段的默认值(例如字符串类型null)

谢谢

将“Isspecial”更改为“Isspecial”,与其他属性相同


另一个问题是,您正在检查构造函数中的“IsSpecial”,此时它无论如何都应该为false。

当前实现中存在两个问题。首先,您的请求json对于嵌套属性无效,json反序列化程序不会使用
TicketsSpecial
为您反序列化

按照以下步骤进行解决方法:

  • 电影

    public class Movie
    {
            public int Id { get; set; }
    
            public bool IsSpecial { get; set; }
    
            public IEnumerable<Ticket> Tickets { get; set; }
    
    }
    
  • 注册
    MyJsonInputFormatter

    public class MyJsonInputFormatter : JsonInputFormatter
    {
            public MyJsonInputFormatter(ILogger logger, JsonSerializerSettings serializerSettings, ArrayPool<char> charPool, ObjectPoolProvider objectPoolProvider, MvcOptions options, MvcJsonOptions jsonOptions) : base(logger, serializerSettings, charPool, objectPoolProvider, options, jsonOptions)
            {
    
            }
            public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
            {
            var result = await base.ReadRequestBodyAsync(context);
            if (result.Model is Movie movie && movie.IsSpecial)
            {
                    context.HttpContext.Request.Body.Position = 0;
                    string request = await new StreamReader(context.HttpContext.Request.Body).ReadToEndAsync();
                    var tickets = JObject.Parse(request)["Tickets"].ToObject<List<TicketSpecial>>();
                    movie.Tickets = tickets;
            }
            return result;
            }
    }
    
    services.AddMvc(o =>
    {
            var serviceProvider = services.BuildServiceProvider();
            var customJsonInputFormatter = new MyJsonInputFormatter(
                            serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<MyJsonInputFormatter>(),
                            serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value.SerializerSettings,
                            serviceProvider.GetRequiredService<ArrayPool<char>>(),
                            serviceProvider.GetRequiredService<ObjectPoolProvider>(),
                            o,
                            serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value
                    );
    
            o.InputFormatters.Insert(0, customJsonInputFormatter);
    })
    

  • IsSpecial
    在构造期间将始终为false,您需要将其值传递给构造函数或更改属性的setter来构建集合。您正在发出的http请求是什么?显示您如何通过PostMani调用它如果我是您,我就不会费心创建模型类的层次结构,只需创建一个处理这两种情况的票据模型(标准和正常)。它与创建请求的方式无关,
    IsSpecial
    在执行
    if(IsSpecial)
    时尚未初始化
    public class Movie
    {
            public int Id { get; set; }
    
            public bool IsSpecial { get; set; }
    
            public IEnumerable<Ticket> Tickets { get; set; }
    
    }
    
    public class MyJsonInputFormatter : JsonInputFormatter
    {
            public MyJsonInputFormatter(ILogger logger, JsonSerializerSettings serializerSettings, ArrayPool<char> charPool, ObjectPoolProvider objectPoolProvider, MvcOptions options, MvcJsonOptions jsonOptions) : base(logger, serializerSettings, charPool, objectPoolProvider, options, jsonOptions)
            {
    
            }
            public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
            {
            var result = await base.ReadRequestBodyAsync(context);
            if (result.Model is Movie movie && movie.IsSpecial)
            {
                    context.HttpContext.Request.Body.Position = 0;
                    string request = await new StreamReader(context.HttpContext.Request.Body).ReadToEndAsync();
                    var tickets = JObject.Parse(request)["Tickets"].ToObject<List<TicketSpecial>>();
                    movie.Tickets = tickets;
            }
            return result;
            }
    }
    
    services.AddMvc(o =>
    {
            var serviceProvider = services.BuildServiceProvider();
            var customJsonInputFormatter = new MyJsonInputFormatter(
                            serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<MyJsonInputFormatter>(),
                            serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value.SerializerSettings,
                            serviceProvider.GetRequiredService<ArrayPool<char>>(),
                            serviceProvider.GetRequiredService<ObjectPoolProvider>(),
                            o,
                            serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value
                    );
    
            o.InputFormatters.Insert(0, customJsonInputFormatter);
    })
    
            {
                    "IsSpecial": true,
                    "Tickets":  [
                                    {"SpecialProp1": "Mumbai Test"}
                            ]
            }