Поместите ошибки ASP.NET Core WEB API ModelState в массив в Angular 6 - PullRequest
0 голосов
/ 07 ноября 2018

У меня в приложении есть модель регистра:

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; }
}

и я отправляю запрос на регистрацию на сервер под углом 6, например:

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

Когда я публикую неправильную модель на сервере, ModelValidation работает нормально и возвращает ошибки ModelState, но console.log(error) показывает объект, подобный этому:

{Password: Array(1), Username: Array(1)}
Password: ["You must specify password between 8 and 12 chars."]
Username: ["The Username field is required."]
__proto__:
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ ()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()

Я хочу поместить сообщения об ошибках в массив строк. Я пытаюсь JOSN.stringify (ошибка) , но это не решает мою проблему.

Вы можете мне помочь?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Asp.Net Core предоставляет возможность настроить ваши недействительные ответы о состоянии модели.

В вашем методе ConfigureServices(IServiceCollection) класса Startup добавьте следующее:

            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 в нужный вам массив ошибок. Пожалуйста, помните, что вы не можете формировать ответ любым другим способом, кроме моей Aggregate функции.

Ваши действия будут возвращать 400 Bad request ответов с массивом ошибок в теле ответа.

0 голосов
/ 07 ноября 2018

Вы можете легко написать функцию для преобразования объекта ошибок модели в желаемую форму. Если я правильно понимаю ваши требования, то приведенная ниже функция должна помочь.

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);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...