LightVx 1.0.2
See the version list below for details.
dotnet add package LightVx --version 1.0.2
NuGet\Install-Package LightVx -Version 1.0.2
<PackageReference Include="LightVx" Version="1.0.2" />
paket add LightVx --version 1.0.2
#r "nuget: LightVx, 1.0.2"
// Install LightVx as a Cake Addin #addin nuget:?package=LightVx&version=1.0.2 // Install LightVx as a Cake Tool #tool nuget:?package=LightVx&version=1.0.2
Light Vx
LightVx is a light, easy and extensible validation framework for .Net which includes a Fluent API.
It's intended to help validating user input in apps, or service requests in Web Services or Web API's, or anywhere you need to validate data.
Author
Tim Wheeler - http://blog.timwheeler.io/ Contact - http://timwheeler.io/#contact
Blog Article with additional technical info
LightVx - A fluent validation framework
Download
Source on GitHub Nuget Package
Release Notes
https://github.com/TjWheeler/LightVx/blob/master/ReleaseNotes.md
Built-in Validators
- Aggregate - Combines other validators
- AlphaNumeric - Alphabetical or Numbers
- AlphaText - a to Z and spaces
- Decimal - a decimal value
- Email - email address
- Url - Uri/Url
- Empty - will match an empty string
- HexColor - a valid hex color
- IsNull - matches null
- Length - matches string length. Supply min and max value.
- MaxLength - matches a max string length
- MinLength - matches a min string length
- Max - validates a number is not greater than x. If input is an
Array
orICollection
then it will validate against number of items. - Min - validates a number is not less than x. If input is an
Array
orICollection
then it will validate against number of items. - NotEmpty - must not be empty string
- Numeric - numbers only
- PhoneAndLength - combine phone number validator and length validator
- PhoneNumber - attempts to validate a phone number with optional braces
- SafeText - very restrictive validator that allows a to Z, space, hyphen and apostrophe.
- Url - validates against a valid url
Fluent API
Using the Validator.Eval
method you can call a number of validators.
Example
var input = "123ABC";
Validator.Eval(input, "Customer ID")
.Required()
.IsAlphaNumeric()
.HasLength(6, 6)
.Success((() =>
{
Console.WriteLine("Validation succeeded");
}))
.Fail((errors, validators) =>
{
Console.WriteLine(string.Join(",", errors));
// Validation failed, put your failure logic here
});
For more examples, see below.
Available Methods
- Required() - must not be null or empty string
- HasLength(int min, int? max)
- IsAlphaNumeric()
- IsAlphaText()
- IsDecimal()
- IsEmailAddress()
- IsNumeric()
- IsPhoneNumber()
- IsSafeText()
- IsUrl()
- Min(int value)
- Min(double value)
- Min(decimal value)
- Max(int/double/decimal value)
- IsEmpty()
- IsNotEmpty()
- IsNull()
- IsNotNull()
- HasMinLength(int minLength)
- HasMaxLength(int maxLength)
Fluent API Examples
Example using Result
var input = 100; //user input to be validated
var result = Validator.Eval(input, "Quantity Requested")
.Required()
.Min(50)
.Max(100)
.Validate();
if (result.IsValid == false)
{
Console.WriteLine(string.Join(";", result.ErrorMessages));
//... add failure logic here
}
Inline Example
var input = "https://github.com/TjWheeler/LightVx"; //user input to be validated
Validator.Eval(input, "Source Url")
.Required()
.IsUrl()
.Success((() =>
{
Console.WriteLine("Validation succeeded");
}))
.Fail((errors, validators) =>
{
Console.WriteLine(string.Join(",", errors));
// Validation failed, put your failure logic here
});
Examples using Validation Helper
//WebApi - Validate that the text is matches Alphabet only
var input = "ABC";
string errorMessage;
if (Validator.IsNotValid<AlphaTextValidator>(input, "First Name" , out errorMessage))
{
return BadRequest($"The input is invalid: {errorMessage}");
}
Examples using Validators directly
Note: Although you can call the validators directly, using the Validation
helper is more convenient.
//Validate numberic
string input = "123ABC";
IValidator validator = new NumericValidator();
validator.Validate(input, "My Field Name");
if (!validator.IsValid)
{
Console.WriteLine("Input: " + input + " return error (" + validator.ErrorMessage + ")");
}
Extending and creating your own validators
In the following example, we are inheriting from an AggregateValidator
, this allows us to combine validators.
Creating a Post Code Validator by combining other validators.
//Step 1: Add the custom validator
public class PostCodeValidator : AggregatedValidator
{
public PostCodeValidator()
{
AddValidator(new LengthValidator(4, 4));
AddValidator(new NumericValidator());
}
}
//Step 2: Add an extension method
public static class PostCodeValidatorExtension
{
public static ValidatorFluent IsPostCode(this ValidatorFluent fluentApi)
{
fluentApi.AddValidator(new PostCodeValidator());
return fluentApi;
}
}
//Step 3: Call it to validate input
public void ExampleCustomValidator()
{
string input = "...";
var isValid = Validator.Eval(input, "MyFieldName")
.Required()
.IsPostCode()
.Fail(((errors, validators) =>
{
Console.WriteLine("Example failure: " + string.Join(";", errors));
})).IsValid;
}
Creating your own validator
Create a class and inherit ValidatorBase
. The only method you need to implement is Validate
. There are some base methods that will make it easy to validate using Regular Expressions. Here's an example of one of the built in validators.
/// <summary>
/// Validate Email Addresses
/// </summary>
public class EmailValidator : ValidatorBase
{
protected override string Expression => @"^([\&\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
protected override void Validate()
{
if (_Input == null || (string) _Input == string.Empty)
{
Succeed();
return;
}
if (SingleMatch((string) _Input))
Succeed();
else
Fail("is not a valid email address.");
}
}
When using Regular expressions you can also use the HasMatch
and MatchCount
base methods.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net40 is compatible. net403 was computed. net45 is compatible. net451 was computed. net452 was computed. net46 was computed. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.0
- No dependencies.
-
.NETFramework 4.5
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
4.0.1 | 7,484 | 4/20/2023 |
4.0.0 | 352 | 2/10/2023 |
3.1.0 | 367 | 1/21/2023 |
3.0.3 | 326 | 1/21/2023 |
3.0.2 | 304 | 1/20/2023 |
3.0.1 | 7,905 | 7/24/2022 |
3.0.0 | 454 | 7/24/2022 |
2.0.8 | 450 | 7/23/2022 |
2.0.7 | 480 | 7/13/2022 |
2.0.6 | 471 | 6/19/2022 |
2.0.5 | 522 | 4/27/2022 |
2.0.4 | 454 | 4/15/2022 |
2.0.3 | 608 | 11/16/2020 |
2.0.2 | 688 | 5/28/2020 |
2.0.1 | 503 | 5/22/2020 |
2.0.0 | 514 | 4/21/2020 |
1.2.0 | 1,779 | 5/4/2018 |
1.1.1 | 1,038 | 4/27/2018 |
1.1.0 | 1,134 | 3/8/2018 |
1.0.3 | 913 | 2/20/2018 |
1.0.2 | 1,101 | 2/12/2018 |
1.0.1 | 998 | 2/11/2018 |
1.0.0 | 976 | 2/11/2018 |