.Net Core API ModelState errors with Angular 8 FormArray



我正在使用.Net Core 3.0和Angular 8。我正在使用Angular的Reactive Forms和FormBuilder,以及FormGroup和FormArray构建表单。基本上,我有两个模型在.Net API中看起来像这样:

public class Parent
{
[Required]
public string Name { get; set; }
[Required]
public List<Child> Children { get; set; }
}
public class Child
{
[Required]
public string Name { get; set; }
[Required]
public string Description { get; set; }
}

在 Angular 中,我使用 FormBuilder 构建这样的表单:

// In the component class
// this.fb is type FormBuilder
form = this.fb.group({
name: [''],
children: this.fb.array([])
});
// Later on, I build the form.children like this
for (var x = 0; x < 9; x++) {
this.form.get('children')
.push(this.fb.group({
name: [''],
description: ['']
});
}

请注意 .Net 中模型上的[Required]属性。因此,如果我提交的表单没有所需属性的值,.Net 将返回如下所示的响应:

"errors": {
"name": ["The Name field is required"],
"children[0].name": ["The Name field is required"],
"children[0].description": ["The Description field is required"],
// and so on
}

我可以清楚地告诉我的 Angular 表单name字段有错误,因为如果我循环访问该响应中的错误,我可以说this.form.get('key')keyerrors对象中的每个键。但是,这似乎不适用于childrenFormArray。

到目前为止,我能够让它工作的唯一方法是手动解析错误键。不过,这感觉非常错误,因为我必须手动解析每个children[index].fieldName错误的索引值。

我知道在 Angular 中使用内置和客户验证器的客户端验证。这些也将到位,但我希望能够在某些内容通过客户端验证时使用 API 的 400 响应。

我错过了什么吗?有没有办法获取.Net HTTP 400错误响应 - 特别是errors对象 - 并将这些错误添加到childrenFormArray中的正确FormGroup(例如children[0].name(?我想我可能因为不熟悉反应式表单而错误地使用了 FormGroup 和 FormArray(这是我第一次使用它们(。但从我读到的东西来看,这对我来说是正确的。

让我们分解一下您的几个问题和陈述:

有没有办法将.Net HTTP 400错误响应直接映射到Angular FormGroup

不,您不能将HTTP 400响应"映射"到任何类型的Angular组件,我不确定您在某种程度上是什么意思。HTTP 状态代码应由 if 语句检查,或者可能使用某些 HTTP 库输入 catch 块,这些库将针对某些 HTTP 状态代码抛出。

但从我读到的东西来看,这对我来说是正确的

我不认为你的代码走在正确的轨道上。最好从不做回发开始,以处理使用 Angular Reactive Forms 或任何 Web 表单验证的错误验证。您应该具有客户端验证来处理验证并确保发布到 API 的有效数据。当然,您仍然会触发服务器端模型验证以验证数据是否有效,您始终对 API 的任何帖子执行此操作,运行服务器端验证,因为您永远不知道哪个客户端在调用您的 API,也不关心请求是否有效。

您应该使用反应式表单验证器

*不要挂断重复验证代码客户端。 ASP.NET 数据注释立即导致这种愿望,因此 ASP.NET Razor 视图存在 MVC 不显眼的验证。我在这条路上走得很远。NodeJs 是一个很好的解决方案,因为用于验证的 Javascript 可以共享客户端和服务器端。有一个名为ServiceStack的昂贵架构,它使用Fluent Validation,它具有共享服务器端验证客户端的能力,但是,在Angular Reactive Forms的情况下,使用Angular Reactive Forms时,您仍然拥有单独的代码客户端,因为实际上您的验证器是告诉Angular Reactive Forms字段是否无效的正确方法。对于 .NET Core 和 Angular Reactive Forms,为客户端和服务器端提供单独的验证机制是有效的,也许最好是 *

最新更新