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"}
]
}