Web API-当无效输入导致模型绑定失败时,覆盖模型状态错误

时间:2018-11-01 19:42:59

标签: c# asp.net asp.net-web-api

我正在使用ASP.NET Core 2.1。我试图覆盖由于无效输入而导致模型绑定失败时返回的默认错误消息。

当我为ScheduledTime发布无效值时(例如,我传递"abc"作为值),我得到以下错误消息。我想覆盖错误消息以显示更用户友好的内容。

是否可以在验证过程中或其他地方设置某些内容来覆盖邮件?

{
    "scheduledTime": [
        "Could not convert string to DateTime: abc. Path 'scheduledTime', line 5, position 23."
    ]
}

下面是我的外部模型。请注意,ScheduledTime已正确设置为可为空,以防止发布不足,因为这是必需的。

 public class EventInputDto
    {
        public string Title { get; set; }
        public string Message { get; set; }
        public string Url { get; set; }
        public DateTime? ScheduledTime { get; set; }
        public Guid UserId { get; set; }
    }

我不在模型类上使用DataAnnotations(在实体上使用它们),而是对模型使用FluentValidation。

 public EventInputValidator()
        {
            RuleFor(inputDto => inputDto.Title).NotNull().WithMessage("Title cannot be blank")
              .Length(1,50);

            RuleFor(inputDto => inputDto.Message).NotNull().WithMessage("Message cannot be blank")
              .Length(1, 1000);

            RuleFor(inputDto => inputDto.Url).NotNull();

            RuleFor(inputDto => inputDto.ScheduledTime).NotNull();

            RuleFor(inputDto => inputDto.UserId).NotNull();

        }

以下是在我的控制器上发布操作:

[HttpPost]
        public async Task<IActionResult> PostEvent([FromBody] EventInputDto eventInputDto)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var user = await _userRepository.GetUserAsync(eventInputDto.UserId);

            if(user == null)
            {
                return BadRequest(new {Error = "The user was not found in the system. Please try again with an authorized and valid user."});
            }

            var eventToAdd = _mapper.Map<Event>(eventInputDto);

            eventToAdd.CreatedBy = user;
            _eventRepository.AddEvent(eventToAdd);
            if(!await _eventRepository.SaveChangesAsync())
            {
                throw new Exception("Error saving to the database");
            }

            var eventToReturn = _mapper.Map<EventViewDto>(eventToAdd);

            return CreatedAtAction("GetEvent", new { id = eventToAdd.Id }, eventToReturn);
        }

0 个答案:

没有答案