在特定字符串值上验证模型

本文关键字:验证 模型 字符串 | 更新日期: 2023-09-27 18:16:36

我正在做一个Web API 2项目。除了要求某些属性是必需的之外,有些属性只能具有特定的值。一种选择是,我可以尝试将模型保存到数据库(EF6)并在保存时创建一些逻辑,但我认为在调用数据库之前最好验证是否设置了正确的值。数据注释是否提供了一个类似Range的属性,然后像下面的例子一样为特定的字符串值提供属性?还是我必须编写自己的验证器属性?

public class Person {
    public int PersonID { get; set; }
    [Required]
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [StringRange("M","F")]
    public string Gender { get; set; }
}

在上面的例子中,当对控制器进行post时,唯一接受的值是"M"或"F"。

在特定字符串值上验证模型

如果将来有人偶然发现这个线程,我将其进一步扩展,并添加了一个公共字符串数组属性,接受验证过滤器中允许的值。这将允许您在属性装饰器中提供有效字符串的集合。

通过这种方式,您现在拥有了一个通用的可重用属性,您可以随时使用它来将模型字符串属性限制为预定义的值集。因为它是一个验证属性,所以您还可以用更多信息的错误消息来修饰它。

使用例子:

public class Person {
    [StringRange(AllowableValues = new[] { "M", "F" }, ErrorMessage = "Gender must be either 'M' or 'F'.")]
    public string Gender { get;set; }
}

字符串属性:

public class StringRangeAttribute : ValidationAttribute
{
    public string[] AllowableValues { get; set; }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (AllowableValues?.Contains(value?.ToString()) == true)
        {
            return ValidationResult.Success;
        }
        var msg = $"Please enter one of the allowable values: {string.Join(", ", (AllowableValues ?? new string[] { "No allowable values found" }))}.";
        return new ValidationResult(msg);
    }
}

为了验证Gender属性,我通过创建一个新类(attribute)创建了一个自定义验证属性:

using System;
using System.Collections.Generic;
using System.Web;
using System.ComponentModel.DataAnnotations;    
namespace MyProject.Models.Validation
{
    public class StringRangeAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if(value.ToString() == "M" || value.ToString() == "F")
            {
                return ValidationResult.Success;
            }

            return new ValidationResult("Please enter a correct value");
        }
    }
}

你可以像这样使用正则表达式:

[RegularExpression("M|F", ErrorMessage = "The Gender must be either 'M' or 'F' only.")]
public string Gender { get; set; }

但是在我的API中,当我传递数据时,它会显示错误消息所以你可以加上

[StringLength(1, MinimumLength = 1, ErrorMessage = "The Gender must be 1 characters.")]
最终代码:

[StringLength(1, MinimumLength = 1, ErrorMessage = "The Gender must be 1 characters.")]
[RegularExpression("M|F", ErrorMessage = "The Gender must be either 'M' or 'F' only.")]
public string Gender { get; set; }
[Required]
[RegularExpression("value1|value2|value3|...", ErrorMessage = "YourMessageHere")]
public string Gender { get; set; }