2015-04-09 3 views
1

Я хочу интегрировать загрузочные файлы .alert alert-warning классов с FluentValidation для отображения/скрытия предупреждающих сообщений. Я думал, что могу установить пользовательское состояние в правиле и отправить его на клиентскую сторону, чтобы показать и скрыть предупреждающее сообщение, но я не могу понять это. вот что я до сих пор:FluentValidation: получить CustomState на стороне клиента

public class FooValidator : AbstractValidator<FooVm> 
    { 
    public FooValidator() 
    { 
     RuleFor(model => model.Temperature) 
     .NotNull() 
     .LessThanOrEqualTo(model => model.MaxTemp) 
      .WithState(model => ValidationType.Warning) 
      .WithMessage("Warning, temp should be less than or equal to {ComparisonValue}") 
     .GreaterThanOrEqualTo(model => model.MinTemp) 
      .WithState(model => ValidationType.Warning) 
      .WithMessage("Warning, temp should be greater than or equal to {ComparisonValue}"); 
    } 
    } 

и вот мой LessThanOrEqualTo валидатор, чтобы получить правила клиента. Пожалуйста, обратите внимание, у меня есть TODO в конце, чтобы установить состояние аргумент для клиента

public class LessThanOrEqualPropertyValidator : FluentValidationPropertyValidator 
    { 
    public LessThanOrEqualPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator) 
     : base(metadata, controllerContext, rule, validator) 
    { 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     if (!ShouldGenerateClientSideRules()) yield break; 

     var validator = (LessThanOrEqualValidator)Validator; 
     object val; 
     string variableInMsg; 

     var propertyToCompare = validator.MemberToCompare as PropertyInfo; 

     // get the value from the property instead of using the property 
     if (propertyToCompare != null) 
     { 
     val = this.Metadata.Container.GetType().GetProperty(propertyToCompare.Name).GetValue(this.Metadata.Container, null); 
     variableInMsg = "ComparisonValue"; 
     } 
     else 
     { 
     val = validator.ValueToCompare; 
     variableInMsg = "ValueToCompare"; 
     } 

     var errorMessage = new MessageFormatter() 
      .AppendPropertyName(Rule.GetDisplayName()) 
      .AppendArgument(variableInMsg, val) 
      .BuildMessage(validator.ErrorMessageSource.GetString()); 

     var rule = new ModelClientValidationRule(); 
     rule.ErrorMessage = errorMessage; 
     rule.ValidationType = "lessthanorequal"; 
     rule.ValidationParameters["valuetocompare"] = val; 
     rule.ValidationParameters["state"] = // TODO: how can i send state across, i know you can view it when validating the obj 
     yield return rule; 
    } 
    } 

и вот мой код клиента, где я хочу быть в состоянии поднять состояние в объекте Params. Предупреждения всегда будут возвращать true;

$.validator.addMethod("lessthanorequal", function (value, element, params) { 
    var isValid = this.optional(element) || parseFloat(value) <= parseFloat(params.valuetocompare) 

    // TODO: how to get state 
    //if(params.state === "Warning") { 
    // if (isValid) { 
    //  $(".alert-warning").hide(); 
    // } 
    // else { 
    //  $(".alert-warning").show(); 
    // } 
    // return true; 
    //} 

    return isValid 
}); 

$.validator.unobtrusive.adapters.add("lessthanorequal", ["valuetocompare"], function (options) { 
    options.rules['lessthanorequal'] = options.params; 
    if (options.message) { 
     options.messages['lessthanorequal'] = options.message; 
    } 
}); 
+0

Вы видите, что все параметры ограничены вашим элементом пользовательского интерфейса на стороне клиента? –

+0

Извините, я не уверен, что вы имеете в виду? –

+0

Фактически на стороне клиента ненавязчивое связывает параметры стороны клиента в элементе Form через атрибуты данных. Вы можете их видеть? например

ответ

0

kudos отправляется на @KundanSinghChouhan для указания того, что я должен был видеть. Объект state находился в атрибуте data-val, но не как значение, которое я мог бы использовать непосредственно на клиенте. Ниже то, что я сделал, чтобы получить эту работу в моем LessThanOrEqualPropertyValidator

rule.ValidationParameters["state"] = this.CustomStateProvider.Invoke(null); 

Я не знаю последствия это будет иметь, когда ValidationError список вывешен на сервер, потому что класс хранит это значение State, но я буду рассмотрите, что если мне когда-либо понадобится использовать этот класс.

Смежные вопросы