【问题标题】:ASP.NET Core 6 Web API - making fields requiredASP.NET Core 6 Web API - 使字段成为必填项
【发布时间】:2022-01-02 09:17:56
【问题描述】:

我有一个基本的 CRUD API,可以将模型保存到运行良好的 MongoDB。

模型如下所示:

[BsonIgnoreExtraElements]
public class Configuration
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [Display(Name = "Parameter Name")]
    [Required]
    public string ParamName { get; set; }
    [Display(Name = "Parameter Value")]
    [Required]
    public string ParamValue { get; set; }
    public string Description { get; set; }
}

而我的动作是这样的:

[HttpPost(Name = "Create")]
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<ActionResult<ApiResult>> Create(Configuration configuration)
{
        try
        {
            var res = await _configurationRepository.Add(configuration);
            // DO OTHER STUFF
        }
        catch (Exception ex)
        {
            //error handling stuff
        }
}

当我将此代码移植到 .NET 6 时,我通过 Postman 尝试上述操作,但出现此错误:

“类型”:“https://tools.ietf.org/html/rfc7231#section-6.5.1”,
"title": "出现一个或多个验证错误。",
“状态”:400,
“Id 字段是必需的。”

知道为什么会这样吗?字符串字段也是如此。这只是一个示例,由于此更改,我的大部分操作基本上都不起作用。

【问题讨论】:

    标签: asp.net-core asp.net-web-api .net-6.0 visual-studio-2022


    【解决方案1】:

    这是由于 ASP.Net 6 中的一些模型验证更改(非 Nullable 引用类型)

    通过执行以下操作可以解决此问题:

    https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-6.0

    services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);
    

    【讨论】:

    • 这会抑制所有成员的所有必需注释。可能要小心禁用。
    • 我认为它只适用于隐式必需属性。不明确
    【解决方案2】:

    2 种可能的解决方法:

    builder.Services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);

    或将所有字符串类型更改为字符串?来自配置类。

    【讨论】:

    • JapaTechFoss,这在很大程度上看起来像是一个答案。但是“?”在最后一行让我感到困惑。你是按照How to Answer来回答的,不是吗?
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    这是因为[BsonId]需要设置字符串。

    参考源代码: https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Bson/Serialization/Attributes/BsonRequiredAttribute.cs

    您应该为您的端点创建一个不同的模型,并将该模型映射到您的数据模型,并用一个值填充 Id 字段。

    【讨论】:

    • 确实如此,当保存到 MongoDB 时。但不在模型中。它也适用于 .net 5
    【解决方案4】:

    有 3 个选项可以解决此问题。您可以尝试其中任何一种来使其正常工作:

    1. 检查您的 csproj 文件是否有条目 &lt;Nullable&gt;enable&lt;/Nullable&gt;。如果是,请将其删除。

    2. public string Id { get; set; } 更改为public string? Id { get; set; }

    3.将此行添加到Program.cs中

    builder.Services.AddControllers(
    options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);
    

    --干杯

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2021-12-14
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多