gpt4 book ai didi

c# - 如果存在无效的属性值,Asp.net Core 不会绑定(bind)后期模型

转载 作者:行者123 更新时间:2023-11-30 23:00:24 24 4
gpt4 key购买 nike

我正在将一个应用程序从遗留的 asp.net webapi 迁移到 asp.net core mvc。我注意到一个问题。对于某些请求,我们会在 POST 主体中发送部分甚至无效的值。而 asp.net core 拒绝反序列化它。

例如帖子模型

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

public Category? Category { get; set; }
}

public enum Category
{
Public,
Personal
}

Action

[HttpPost]
public async Task<Response> Post([FromBody]PostModel model)
=> this.Service.Execute(model);

对于以下示例请求

POST /endpoint
{
id: 3,
category: "all"
}

ModelState 集合记录了一个错误 - 表明 all 是一个无效的类别,并且 PostModel 参数 model 为空。是否可以禁用此行为并尝试绑定(bind)帖子正文中可能的所有属性,而忽略它无法绑定(bind)的属性?这就是在我们的遗留 API 中为我们完成的方式,现在,我需要移植它。

禁用模型验证对我们没有帮助。 model 参数仍然为空。

最佳答案

对于FromBody,它会通过JsonInputFormatterrequest body绑定(bind)到Model

对于JsonInputFormatter,它会在没有报错时调用return InputFormatterResult.Success(model),并调用return InputFormatterResult.Failure(); 当有任何错误时。对于 return InputFormatterResult.Failure();,它不会绑定(bind) valid 属性。

对于解决方案,您可以实现自定义格式化程序以返回 return InputFormatterResult.Success(model)

  1. 根据 JsonInputFormatter 实现自定义格式器 CustomFormatter .
  2. InputFormatterResult.Failure() 替换为 InputFormatterResult.Success(model)

                    if (!(exception is JsonException || exception is OverflowException))
    {
    var exceptionDispatchInfo = ExceptionDispatchInfo.Capture(exception);
    exceptionDispatchInfo.Throw();
    }
    return InputFormatterResult.Success(model);
  3. Startup.cs 中注入(inject) CustomFormatter

            services.AddMvc(o =>
    {
    var serviceProvider = services.BuildServiceProvider();
    var customJsonInputFormatter = new CustomFormatter(
    serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<CustomFormatter>(),
    serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value.SerializerSettings,
    serviceProvider.GetRequiredService<ArrayPool<char>>(),
    serviceProvider.GetRequiredService<ObjectPoolProvider>(),
    o,
    serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value
    );

    o.InputFormatters.Insert(0, customJsonInputFormatter);
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

关于c# - 如果存在无效的属性值,Asp.net Core 不会绑定(bind)后期模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51596092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com