using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.Text.RegularExpressions; using System.Web.Mvc; using Sleis.Models; using System.Text; namespace Sleis.Validation.Attribute { public class DecimalValidationAttribute : ValidationAttribute { public string PrecisionFormat { get; set; } public DecimalValidationAttribute() { if(String.IsNullOrEmpty(base.ErrorMessage)) { base.ErrorMessage = Constants.InvalidNumericValueErrorMessage; } } public override bool IsValid(object value) { //don't worry about being required. let required attribute handle that if (value == null) { return true; } Regex regex = new Regex(Pattern(this.PrecisionFormat)); return regex.IsMatch(value.ToString()); } public static string Pattern(string precisionFormat) { string[] vals = precisionFormat.Split(','); StringBuilder pattern = new StringBuilder(@"^-?0*\d{0,"); pattern.Append(vals[0]); pattern.Append(@"}(\.\d{0,"); pattern.Append(vals[1]); pattern.Append(@"})?$"); return pattern.ToString(); } } public class DecimalValidator : DataAnnotationsModelValidator { #region Fields private readonly string _errorMessage; private readonly string _precisionFormat; #endregion Fields #region Ctors /// /// Initializes a new instance of the class. /// /// The metadata. /// The context. /// The attribute. public DecimalValidator(ModelMetadata metadata, ControllerContext context, DecimalValidationAttribute attribute) : base(metadata, context, attribute) { this._errorMessage = attribute.ErrorMessage; this._precisionFormat = attribute.PrecisionFormat; } #endregion Ctors #region Methods /// /// Retrieves a collection of client validation rules. /// /// A collection of client validation rules. public override IEnumerable GetClientValidationRules() { var rule = new ModelClientValidationRegexRule(this._errorMessage, DecimalValidationAttribute.Pattern(this._precisionFormat)); return new[] { rule }; } #endregion Methods } }