Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ASP.NET核心WEB API ModelState错误放入6中的数组_C#_Angular_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 将ASP.NET核心WEB API ModelState错误放入6中的数组

C# 将ASP.NET核心WEB API ModelState错误放入6中的数组,c#,angular,asp.net-core,asp.net-core-webapi,C#,Angular,Asp.net Core,Asp.net Core Webapi,我的应用程序中有一个寄存器模型,如下所示: public class UserRegisterDTO { public int Id { get; set; } [Required] public string Username { get; set; } [Required] [StringLength(12, MinimumLength = 8, ErrorMessage = "You must specify password between 8 a

我的应用程序中有一个寄存器模型,如下所示:

public class UserRegisterDTO
{
    public int Id { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    [StringLength(12, MinimumLength = 8, ErrorMessage = "You must specify password between 8 and 12 chars.")]
    public string Password { get; set; }
}
我通过angular 6向服务器发送一个注册请求,如下所示:

登记册{ this.authService.registerthis.model.subscribe=>{ this.alertify.success“注册成功”; },错误=>{ console.logerror; this.alertify.errorerror; }; } 当我将错误的模型发布到服务器时,ModelValidation工作正常并返回ModelState错误,但console.logerror显示如下对象:

{密码:Array1,用户名:Array1} 密码:[您必须指定8到12个字符之间的密码。] 用户名:[用户名字段是必需的。] __原型: 构造函数:ƒ对象 hasOwnProperty:ƒhasOwnProperty isPrototypeOf:ƒisPrototypeOf propertyIsEnumerable:ƒpropertyIsEnumerable toLocaleString:ƒtoLocaleString 托斯特林:ƒ valueOf:ƒvalueOf __定义者:定义者__ __定义设置:定义设置__ __查找器:查找器__ __查找记录器:查找记录器__ 获取原始文件:原始文件__ 集合uuu-proto uuuu:u402 uuuu-proto__ 我想把错误消息放到字符串数组中。我尝试了JOSN.stringifyerror,但它不能解决我的问题


您能帮助我吗?

您可以轻松编写一个函数,将模型错误对象转换为所需的形式。如果我正确地理解了您的需求,那么下面的函数应该可以做到这一点

transformError(err: { [key:string]: any }) {
    const messages: string[] = [];

    if (err) {
        for (let key of err) {
            for (let message of err[key]) {
                messages.push(`${key}: ${message}`);
            }
        }
    }

    return messages;
}

register() {
    this.authService.register(this.model).subscribe(() => {
        this.alertify.success('Registration successful');
    }, error => {
        const messages = this.transformError(error);
        this.alertify.error(messages);
    });
}

您可以轻松编写一个函数,将模型错误对象转换为所需的形式。如果我正确地理解了您的需求,那么下面的函数应该可以做到这一点

transformError(err: { [key:string]: any }) {
    const messages: string[] = [];

    if (err) {
        for (let key of err) {
            for (let message of err[key]) {
                messages.push(`${key}: ${message}`);
            }
        }
    }

    return messages;
}

register() {
    this.authService.register(this.model).subscribe(() => {
        this.alertify.success('Registration successful');
    }, error => {
        const messages = this.transformError(error);
        this.alertify.error(messages);
    });
}

Asp.NETCore提供了一种自定义无效模型状态响应的方法

在Startup类的ConfigureServicesServiceCollection方法中,添加以下内容:

            services.Configure<ApiBehaviorOptions>(options =>
        {
            options.InvalidModelStateResponseFactory = context =>
            {
                 object responseObject = context.ModelState.Select(entry => entry.Value.Errors.Select(error => error.ErrorMessage)).Aggregate(Enumerable.Empty<string>(), (agg, val) => agg.Concat(val));
                return new BadRequestObjectResult(responseObject);
            };
        });
这将把ModelState字典转换为所需的错误数组。 请不要告诉我,除了我的聚合函数之外,你可以用任何你想要的方式来塑造响应


然后,您的操作将返回400个错误的请求响应,响应正文中包含错误数组。

Asp.Net Core提供了一种自定义无效模型状态响应的方法

在Startup类的ConfigureServicesServiceCollection方法中,添加以下内容:

            services.Configure<ApiBehaviorOptions>(options =>
        {
            options.InvalidModelStateResponseFactory = context =>
            {
                 object responseObject = context.ModelState.Select(entry => entry.Value.Errors.Select(error => error.ErrorMessage)).Aggregate(Enumerable.Empty<string>(), (agg, val) => agg.Concat(val));
                return new BadRequestObjectResult(responseObject);
            };
        });
这将把ModelState字典转换为所需的错误数组。 请不要告诉我,除了我的聚合函数之外,你可以用任何你想要的方式来塑造响应


然后,您的操作将返回400个错误请求响应,并在响应正文中显示错误数组。

感谢您的帮助。你和Daniel Gimenez给了我一个正确的答案。谢谢你的帮助。你和Daniel Gimenez给了我一个正确的答案。