【问题标题】:Json.net and Web Api Conditional Validation on model properties模型属性的 Json.net 和 Web Api 条件验证
【发布时间】:2020-03-14 05:47:39
【问题描述】:

我知道我可以通过实现 IValidateObject 来验证模型对象,但不幸的是,当您的控制器被装饰时,当将 json 请求转换为对象时,这并没有给您提供说明行和未通过 json 验证的类型的好错误带有 FromBody 属性。

我的问题是,是否可以在 ApiController 中有条件地验证对象属性并免费获得漂亮的错误格式?举一个任意的例子,如果 IsAdmin 为真,假设下面需要验证角色的 Account 类有多个项目?

    public class Account
    {
        [JsonRequired]
        public bool IsAdmin { get; set; }
        public IList<string> Roles { get; set; }
    }

【问题讨论】:

  • 您考虑过使用 Fluentvalidation 吗?看看这里stackoverflow.com/questions/8084374/…
  • 嗨,Alexey,我还没有,我会看看,但是你知道吗?我仍然很想知道您是否可以在 Json.net 中进行条件验证。

标签: asp.net-core asp.net-web-api json.net asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

是否可以在 ApiController 中有条件地验证对象属性并免费获得漂亮的错误格式?举一个任意的例子,如果 IsAdmin 为真,假设下面需要验证角色的 Account 类有多个项目?

试试这个:

1.Controller(一定要加上[ApiController]否则需要判断ModelState):

[Route("api/[controller]")]
[ApiController]
public class ValuesController : Controller
{
    [HttpPost]
    public IActionResult Post([FromBody]Account account)
    {
        return Ok(account);
    }
}

2.型号:

public class Account: IValidatableObject
{
    [JsonRequired]
    public bool IsAdmin { get; set; }
    public IList<string> Roles { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var count = 0;
        if (IsAdmin == true) 
        {
            if (Roles != null)
            {
                foreach (var role in Roles)
                {
                    count++;
                }                   
            }
        }
        if (count <= 1)
        {
            yield return new ValidationResult(
           $"Roles had more than one item", new[] { "Roles" });
        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多