Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The RegularExpression data annotation is not being recognized by the Validator

I believe the code is pretty self-explanatory. Why isn't the RegularExpression attribute being used by the Validator?

License.cs:

public class License {
  [Required]
  [RegularExpression("([0-9A-F]{4}\\-){4}[0-9A-F]{4}")]
  public string Code { get; set; }
}

LicenseTest.cs

[TestMethod]
public void TestValidationOfCodeProperty()
{
    // These tests pass so I know the regex is not the issue
    Assert.IsTrue(Regex.IsMatch("ABCD-EF01-2345-6789-FFFF", "([0-9A-F]{4}\\-){4}[0-9A-F]{4}"));
    Assert.IsFalse(Regex.IsMatch("abcd-ef01-2345-6789-ff00", "([0-9A-F]{4}\\-){4}[0-9A-F]{4}"));
    Assert.IsFalse(Regex.IsMatch("3331313336323034313135302020202020212121", "([0-9A-F]{4}\\-){4}[0-9A-F]{4}"));

    // Setup Validator
    License lic = new License();
    var ctx = new ValidationContext(lic);
    var results = new List<ValidationResult>();

    // Passes - TryValidateObject returns false because the required field is empty
    lic.Code = "";
    Assert.IsFalse(Validator.TryValidateObject(lic, ctx, results));

    // Passes - TryValidateObject returns true
    lic.Code = "10D0-4439-0002-9ED9-0743";
    Assert.IsTrue(Validator.TryValidateObject(lic, ctx, results));

    // FAILS - TryValidateObject returns true
    lic.Code = "3331313336323034313135302020202020212121";
    Assert.IsFalse(Validator.TryValidateObject(lic, ctx, results));
}      
like image 252
Lawrence Barsanti Avatar asked Apr 01 '15 13:04

Lawrence Barsanti


People also ask

What is regular expression in data Annotation c#?

The regular expression enables you to specify very precisely the format of valid values. The Pattern property contains the regular expression. If the value of the property is null or an empty string (""), the value automatically passes validation for the RegularExpressionAttribute attribute.

What is an attribute in data Annotation?

We'll use the following Data Annotation attributes: Required – Indicates that the property is a required field. DisplayName – Defines the text to use on form fields and validation messages. StringLength – Defines a maximum length for a string field. Range – Gives a maximum and minimum value for a numeric field.


1 Answers

use Validator.TryValidateObject(lic, ctx, results, true)

MSDN explains the last argument: https://msdn.microsoft.com/en-us/library/dd411772(v=vs.110).aspx

true to validate all properties; if false, only required attributes are validated

like image 131
Gongdo Gong Avatar answered Oct 02 '22 09:10

Gongdo Gong