gpt4 book ai didi

asp.net-core-webapi - 如何反序列化 422 无法处理的实体错误模型并将错误绑定(bind)到 asp.net core razor pages 模型状态

转载 作者:行者123 更新时间:2023-12-03 19:15:18 25 4
gpt4 key购买 nike

我的 Asp.Net Core 3.1 API返回 422 Unprocessable Entity错误响应如下图:

{
"type": "https://test.com/modelvalidationproblem",
"title": "One or more model validation errors occurred.",
"status": 422,
"detail": "See the errors property for details.",
"instance": "/api/path",
"traceId": "8000003f-0001-ec00-b63f-84710c7967bb",
"errors": {
"FirstName": [
"The FirstName field is required."
]
}
}

如何反序列化此响应并将错误添加到 Asp.Net Core 3.1 Razor Pages 中的模型验证错误?

我尝试创建如下所示的模型,

错误型号:

public class UnprocessableEntity
{
public string Type { get; set; }
public string Title { get; set; }
public int Status { get; set; }
public string Detail { get; set; }
public string Instance { get; set; }
public string TraceId { get; set; }
public Errors Errors { get; set; }
}

public class Errors
{
....// what should I need to add here? Keys and messages will be dynamic
}

但是我应该在 Errors 中添加什么类(class)?错误键和消息将是动态的。

一旦知道了上述内容,我就可以在我的 Razor 页面中添加模型状态错误,如下所示,

using var responseStream = await response.Content.ReadAsStreamAsync();
var errorResponse = await JsonSerializer.DeserializeAsync<UnprocessableEntity>(responseStream);

foreach (var error in errorResponse.errors)
{
ModelState.AddModelError(error.key, error.Message[0]); // I'm stuck here
}

最佳答案

首先,您应该确保关键字段名称与从 api ( pay attention to case ) 返回的 json 相同。

 public class UnprocessableEntity
{
public string type { get; set; }
public string tTitle { get; set; }
public int status { get; set; }
public string detail { get; set; }
public string instance { get; set; }
public string traceId { get; set; }
public Errors errors { get; set; }
}

然后, Errors 的字段类应包含已验证类的所有字段,并且字段名称应保持一致,但需要 define their type as an array to receive ,因为json中errors返回的每个字段都是一个数组。 (这里我创建了一个名为 StudInfo 的简单验证类):
    public class StudInfo
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
}


public class Errors
{
public List<string> Id { get; set; }
public List<string> Name { get; set; }
}

然后您可以使用如下代码:
       using var responseStream = await response.Content.ReadAsStreamAsync();
var errorResponse = await JsonSerializer.DeserializeAsync<UnprocessableEntity>(responseStream);
var t = typeof(Errors);
var fieldNames = typeof(Errors).GetProperties()
.Select(field => field.Name)
.ToList();
foreach (var name in fieldNames)
{
List<string> errorLists = (List<string>)errorResponse.errors.GetType().GetProperty(name).GetValue(errorResponse.errors);
if (errorLists != null)
{
ModelState.AddModelError(name, errorLists[0]);
}

}

关于asp.net-core-webapi - 如何反序列化 422 无法处理的实体错误模型并将错误绑定(bind)到 asp.net core razor pages 模型状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60911109/

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