내가 제레미 스키너 (의 창조자로이 작업을 수행하는 방법을 논의했습니다를 Fluent Validation)
http://fluentvalidation.codeplex.com/discussions/253505
그는 완전한 예를 쓸만큼 충분히 친절했습니다. 일치와 NotMatch 모두, 확장
첫째 :
업데이트 여기
우리가 함께했다 코드입니다.
public static class Extensions
{
public static IRuleBuilderOptions<T, string> Match<T>(this IRuleBuilder<T, string> ruleBuilder, string expression)
{
return ruleBuilder.SetValidator(new MatchValidator(expression));
}
public static IRuleBuilderOptions<T, string> NotMatch<T>(this IRuleBuilder<T, string> ruleBuilder, string expression) {
return ruleBuilder.SetValidator(new MatchValidator(expression, false));
}
}
발리
public interface IMatchValidator : IPropertyValidator
{
string Expression { get; }
bool MustMatch { get; }
}
위해 사용 된 인터페이스의 실제 유효성 :
public class MatchValidatorAdaptor : FluentValidationPropertyValidator
{
public MatchValidatorAdaptor(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator)
: base(metadata, controllerContext, rule, validator)
{
}
IMatchValidator MatchValidator
{
get { return (IMatchValidator)Validator; }
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var formatter = new MessageFormatter().AppendPropertyName(Rule.PropertyDescription);
string errorMessage = formatter.BuildMessage(Validator.ErrorMessageSource.GetString());
yield return new ModelClientValidationMatchRule(MatchValidator.Expression, MatchValidator.MustMatch, errorMessage);
}
}
,617 :
public class MatchValidator : PropertyValidator, IMatchValidator
{
string expression;
bool mustMatch;
public MatchValidator(string expression, bool mustMatch = true)
: base(string.Format("The value {0} match with the given expression, while it {1}.", mustMatch ? "did not" : "did", mustMatch ? "should" : "should not"))
{
this.expression = expression;
this.mustMatch = mustMatch;
}
protected override bool IsValid(PropertyValidatorContext context)
{
return context.PropertyValue == null ||
context.PropertyValue.ToString() == string.Empty ||
Regex.IsMatch(context.PropertyValue.ToString(), expression) == mustMatch;
}
public string Expression
{
get { return expression; }
}
public bool MustMatch {
get { return mustMatch; }
}
}
검사기를 등록 어댑터
그리고 마침내 마법이 일어나는 곳 :
public class ModelClientValidationMatchRule : ModelClientValidationRule
{
public ModelClientValidationMatchRule(string expression, bool mustMatch, string errorMessage)
{
if (mustMatch)
base.ValidationType = "match";
else
base.ValidationType = "notmatch";
base.ValidationType += StringFunctions.RandomLetters(6);
base.ErrorMessage = errorMessage;
base.ValidationParameters.Add("expression", expression);
}
}
업데이트 2 :
자바 스크립트 jQuery.validator을 wireup하기 :
실제로
(function ($) {
function attachMatchValidator(name, mustMatch) {
$.validator.addMethod(name, function (val, element, expression) {
var rg = new RegExp(expression, "gi");
return (rg.test(val) == mustMatch);
});
$.validator.unobtrusive.adapters.addSingleVal(name, "expression");
}
$("input[type=text]").each(function() {
$.each(this.attributes, function (i, attribute) {
if (attribute.name.length == 20 && attribute.name.substring(0, 14) == "data-val-match")
attachMatchValidator(attribute.name.substring(9, 20), true);
if (attribute.name.length == 23 && attribute.name.substring(0, 17) == "data-val-notmatch")
attachMatchValidator(attribute.name.substring(9, 23), false);
});
});
} (jQuery));
내가, 내가 처음에 무엇을했다 먹으 렴 있지만 나는 정확하게 무엇이 잘못되었는지를 설명하는 상세한 오류 메시지를 사용자에게 제공하여 어떻게 수정해야 하는지를 설명하고자한다. – Fabian
맞아. 여기서 또 다른 일은 사용자 정의 유효성 검사입니다. 그런 다음 모든 정규식을 평가하고 원하는 오류 메시지를 제공 할 수 있습니다. 무엇보다도, 당신은 기본 MVC 프레임 워크를 벗어날 필요가 없습니다 : [CustomValidation (typeof (MyValidator), "MyCombinedRegexNameValidation")] – Milimetric
그럴 수도 있지만 더 쉽게 여러 속성에 사용할 수있는 더 나은 솔루션을 찾고 있습니다./모델과 나중에 심지어 정확한 javascript 파일을 사용하여 validator clientside를 첨부합니다. – Fabian