首页 > 解决方案 > 使用 TryValidateModel 的问题

问题描述

大家早上好,我在我的模型上使用 TryValidateModel 以确保满足某些必填字段。根据文档,如果有效,则应返回 true,否则返回 false。

当我在我的 .net 核心 API 上使用它而不是使用无效模型返回 false 时,它​​似乎会导致异常并返回它自己的 JSON 以及停止任何进一步的代码执行。

有没有办法让它只返回 false 而不是抛出自己的错误,以便我可以返回自己的 JSON。

当我的验证失败时,我无法使用断点,并返回以下 JSON。

{
   "errors": {"RepairOrder.ReferenceNumber": ["The ReferenceNumber field is required."]},
   "type": null,
   "title": "One or more validation errors occurred.",
   "status": 400,
   "detail": null,
   "instance": null,
   "extensions": {"traceId": "|514b9bb2-4999b11a49fa3351."}
}

编辑:如下要求的代码

using System.ComponentModel.DataAnnotations;

namespace Bright.Models
{
    public class CreateRepairOrderRequest
    {
        public RepairOrder RepairOrder { get; set; }
    }

    public class RepairOrder
    {
        [Required]
        public string ReferenceNumber { get; set; }
    }
}

using Bright.Models;
using Microsoft.AspNetCore.Mvc;


namespace Bright.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class CreateRepairOrderController : ControllerBase
    {

        [HttpPost]
        public CreateRepairOrderResponse Post(CreateRepairOrderRequest createRequest)
        {
            if(!TryValidateModel(createRequest))
                    return new CreateRepairOrderResponse() { AckMessage = "Creation Failed: Missing required field", RetCode = "1" }; //This line is never executed when TryValidateModel fails
        }
}

标签: c#validation.net-core

解决方案


您可以使用ApiController类的Validate( ) 方法手动验证模型并设置ModelState

using Bright.Models;
using Microsoft.AspNetCore.Mvc;


namespace Bright.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class CreateRepairOrderController : ControllerBase
    {

        [HttpPost]
        public CreateRepairOrderResponse Post(CreateRepairOrderRequest createRequest)
        {
            this.Validate(createRequest);

            if (!ModelState.IsValid) 
            {
             //return BadRequest(ModelState);
             return new CreateRepairOrderResponse() { AckMessage = "Creation Failed: Missing required field", RetCode = "1" };
            }

        }
}

推荐阅读