在ASP.NETWebApi中,如果GUID属性无效,则整个POST模型将变为空

bf1o4zei  于 2023-03-31  发布在  .NET
关注(0)|答案(2)|浏览(219)

我有这个模型

public class FooModel
{
  public Guid ReferenceId { get; set; } // <-- this is the important part
  public string SomeValue { get; set; }
}

我有这个控制器端点

[HttpPost]
[ProducesResponseType(200)]
public async Task<IActionResult> SaveFoo([FromBody] FooModel model, CancellationToken ct)
{
  await _fooManager.SaveFoo(model, ct);
  return Ok();
}

我的问题

如果客户端发布了一个类似这样的json,并且referenceId的GUID无效,接收到的整个model对象为null。

{
  "referenceId": "some-invalid-guid!",
  "someValue": "some valid value"
}

我想要的结果
我希望端点接收到的对象不为null,并且包含分配的其他值。referenceId GUID将为null或空。

我所尝试的

我尝试将Guid设置为可空。示例:public Guid? ReferenceId { get; set; }
我想在我的WebApi项目中有一些反序列化设置需要修改,但我不知道在哪里。

xqkwcwgp

xqkwcwgp1#

我建议将ReferenceId声明为字符串而不是Guid,然后在发布后使用Guid.TryParse验证ReferenceId。

4dc9hkyq

4dc9hkyq2#

修复它唯一方法是使用JsonElement作为输入参数(如果使用Newtonsoft.Json,则使用JObject)

[HttpPost]
 public async Task<IActionResult> SaveFoo([FromBody] JsonElement element, CancellationToken ct)
{
    string referenceId = element.GetProperty("ReferenceId").GetString();

    if(Guid.TryParse(referenceId, out var referenceGuid))
   {
     FooModel model = element.Deserialize<FooModel>();
      //... your code
   }
     
}

牛顿软件公司

[HttpPost]
 public async Task<IActionResult> SaveFoo([FromBody] JsonObject obj, CancellationToken ct)
{
   string referenceId = (string) obj["ReferenceId"];

    if(Guid.TryParse(referenceId, out var referenceGuid))
   {
     FooModel model = jObj.ToObject<FooModel>();
      //... your code
   }
     
}

相关问题