验证特定字符串值的模型
Validate model on specific string values
我正在从事 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"。
为了验证性别 属性 我创建了一个自定义验证属性,方法是创建一个新的 class(属性):
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");
}
}
}
以防将来有人偶然发现这个线程,我进一步添加了一个 public 字符串数组 属性 接受验证过滤器中的允许值。这将允许您在属性装饰器中提供有效字符串的集合。
这样,您现在就有了一个通用的可重用属性,您可以随时使用它来将模型字符串 属性 限制为一组预定义的值。由于它是一个验证属性,您还可以用信息更丰富的错误消息来装饰它。
用法示例:
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);
}
}
你可以像这样使用正则表达式:
[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; }
我正在从事 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"。
为了验证性别 属性 我创建了一个自定义验证属性,方法是创建一个新的 class(属性):
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");
}
}
}
以防将来有人偶然发现这个线程,我进一步添加了一个 public 字符串数组 属性 接受验证过滤器中的允许值。这将允许您在属性装饰器中提供有效字符串的集合。
这样,您现在就有了一个通用的可重用属性,您可以随时使用它来将模型字符串 属性 限制为一组预定义的值。由于它是一个验证属性,您还可以用信息更丰富的错误消息来装饰它。
用法示例:
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);
}
}
你可以像这样使用正则表达式:
[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; }