返回

System.Text.Json中的JsonRequired属性:在ASP.NET Core中验证模型的属性是否必填

后端

System.Text.Json中的JsonRequired属性
在System.Text.Json 7.0版本中,引入了一个新的特性JsonRequired,它允许开发人员指定JSON模型中的属性是否必填。这意味着,如果在反序列化JSON数据时,如果缺少了必填的属性,将会抛出异常。

使用JsonRequired属性非常简单,只需在需要验证的属性上添加该特性即可。例如:

public class Person
{
    [JsonPropertyName("name")]
    [JsonRequired]
    public string Name { get; set; }

    [JsonPropertyName("age")]
    [JsonRequired]
    public int Age { get; set; }
}

在上面的示例中,Person类中的Name和Age属性都被标记为必填属性。这意味着,在反序列化JSON数据时,如果缺少了这两个属性中的任何一个,将会抛出异常。

在ASP.NET Core中使用JsonRequired属性

在ASP.NET Core中,可以使用JsonRequired属性来验证JSON模型绑定时属性是否必填。例如,在控制器的方法参数中使用JsonRequired特性,可以确保在绑定模型时,如果缺少了必填的属性,将会抛出异常。

public class HomeController : Controller
{
    [HttpPost]
    public IActionResult CreatePerson([FromBody][JsonRequired] Person person)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        // 保存Person对象到数据库

        return Ok();
    }
}

在上面的示例中,CreatePerson方法使用[FromBody]属性来从请求正文中读取JSON数据,并使用[JsonRequired]属性来确保Name和Age属性都是必填属性。如果缺少了这两个属性中的任何一个,将会抛出异常。

使用其他验证特性及其ErrorMessage实现对JSON模型进行验证的问题

在ASP.NET Core中,可以使用Required、Range等验证特性及其ErrorMessage属性来实现对JSON模型进行验证。但是,在使用这些特性时,可能会遇到一些问题。

例如,在使用Required特性时,如果缺少了必填属性,将会抛出异常,但是异常消息是默认的,无法自定义。要自定义异常消息,可以使用ErrorMessage属性。但是,在使用ErrorMessage属性时,又会遇到另一个问题,那就是ErrorMessage属性只支持字符串类型,无法支持资源文件中的本地化字符串。

为了解决这个问题,可以使用一种变通的方法。首先,创建一个自定义的验证特性,该特性继承自Required特性,并重写FormatErrorMessage方法,在FormatErrorMessage方法中,可以使用资源文件中的本地化字符串。然后,在需要验证的属性上使用这个自定义的验证特性即可。

public class RequiredWithMessageAttribute : RequiredAttribute
{
    private readonly string _errorMessage;

    public RequiredWithMessageAttribute(string errorMessage)
    {
        _errorMessage = errorMessage;
    }

    public override string FormatErrorMessage(string name)
    {
        return _errorMessage;
    }
}

public class Person
{
    [JsonPropertyName("name")]
    [RequiredWithMessage("姓名是必填的")]
    public string Name { get; set; }

    [JsonPropertyName("age")]
    [RequiredWithMessage("年龄是必填的")]
    public int Age { get; set; }
}

在上面的示例中,RequiredWithMessageAttribute是一个自定义的验证特性,它继承自Required特性,并重写了FormatErrorMessage方法,在FormatErrorMessage方法中,可以使用资源文件中的本地化字符串。

总结

在本文中,我们了解了System.Text.Json 7.0中新引入的JsonRequired属性,以及如何在ASP.NET Core中使用它来验证JSON模型绑定时属性是否必填。此外,我们还探讨了使用Required、Range等验证特性及其ErrorMessage实现对JSON模型进行验证的问题,并提供了解决方案。