Data AnnotationAttirbute to validate that value is one one of given stings strings
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace .DataValidation
{
/// <inheritdoc />
/// <summary>
/// Validates that string is one of the given ones:
/// </summary>
/// <example>
/// <code>
/// [OneOf("A","B","C")]
/// [OneOf("A","B","C","Value2", CaseSensitive = false)]
/// </code>
/// </example>
[SuppressMessage("ReSharper", "ConvertToAutoProperty")]
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class OneOfAttribute : ValidationAttribute
{
private readonly string[] _stringValues;
public OneOfAttribute(params string[] stringValues)
{
_stringValues = stringValues;
}
public bool CaseSensitive { get; set; } = true;
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (validationContext.ObjectType != typeof(string))
{
return new ValidationResult($"'{validationContext.DisplayName}' is not of the string type");
}
if (_stringValues.Length == 0)
{
return new ValidationResult($"{this.GetType().Name} Validdation attribute on property '{validationContext.DisplayName}' has no allowed values provided.");
}
string s = value.ToString();
StringComparison comparisionMethod = CaseSensitive ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase;
return new ValidationResult($"'{validationContext.DisplayName}' value should be one of the following: '{string.Join("', '", _stringValues)}'");
}
}
}
using DataValidation;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace CHR.API.Provisioning.ATT.Web.Tests
{
[TestClass]
public class OneOfValidationTests
{
[TestMethod]
public void OneOfAttribute_Should_Validate_Test()
{
//Arrange
var attributeValue = "test";
var validationAttribute = new OneOfAttribute("test", "test1", "test2");
//Act
var isValid = validationAttribute.IsValid(attributeValue);
//Assert
Assert.IsTrue(isValid);
}
[TestMethod]
public void OneOfAttribute_Should_Not_Validate_Test()
{
//Arrange
var attributeValue = "TEST";
var validationAttribute = new OneOfAttribute("test", "test1", "test2");
//Act
var isValid = validationAttribute.IsValid(attributeValue);
//Assert
Assert.IsFalse(isValid);
}
[TestMethod]
public void OneOfAttribute_With_NonCaseSensitiveValue_Separator_Should_Validate_test()
{
//Arrange
var attributeValue = "test";
var validationAttribute = new OneOfAttribute("TEST", "TESTING", "TESTED") {CaseSensitive = false};
//Act
var isValid = validationAttribute.IsValid(attributeValue);
//Assert
Assert.IsTrue(isValid);
}
}
}