我已经尝试了所有找到的解决方案,但大多数不适用于我的问题。我正在使用JSON发送帖子请求,直到3.0,它们都可以正常工作。
您可以在控制器中看到我有[FromBody]
,并且我的模型具有属性。这些是我从其他人那里看到的两个问题。您还可以看到我的请求值与我的模型名称匹配,并且没有丢失。我找不到其他可能导致此问题的东西。
编辑- 根据以下评论,我检查了适当的Json规则。最初,存在默认规则,该规则使值名称的第一个字符变为小写。它会在下降过程中做到这一点,但是我不知道在将值发送到服务器时如何判断这是否会影响它。在将发布的值发送到控制器之前,是否可以在其中放置一个断点来查看发布的值?
Edit2- 将启动更改为该值会使模型不为空,但所有值均为默认值。字符串为空,整数为0。
services.AddControllers().AddJsonOptions(o =>
{
o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
});
似乎大多数与名称更改有关的json选项都不会影响我所看到的反序列化。
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddControllers();
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
//services.AddMvc();
services.AddTransient<AuthService>();
services.AddTransient<LocationService>();
services.AddTransient<MessageService>();
services.AddTransient<AutoAssignService>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();
app.UseRouting();
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
}
请求模型
public class CensusManagementSearch
{
public int LocationId { get; set; }
public int PracticeId { get; set; }
public string Name { get; set; }
public int StatusId { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool Print { get; set; }
}
我的控制器方法
[HttpPost]
public IActionResult PostCensusManagement([FromBody] CensusManagementSearch search)
{
}
答案 0 :(得分:2)
通常,当JSON有效负载未能绑定到控制器动作的模型时,您将看到ModelState.IsValid
等于false。在调试和向下钻取时扩展ModelState.Values
属性将为您提供有关在解析JSON期间失败的详细错误。
请记住,ASP.NET Core 3.0使用新的本机JSON引擎而不是JSON.NET,后者的使用更为有限。这可能是某些属性/类型现在无法正确解析的原因。
要使用自定义日期格式,您必须实现自己的转换器:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture));
}
}
// In ConfigureServices() of Startup.cs
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});