Я хочу интегрировать загрузочные файлы .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;
}
});
Вы видите, что все параметры ограничены вашим элементом пользовательского интерфейса на стороне клиента? –
Извините, я не уверен, что вы имеете в виду? –
Фактически на стороне клиента ненавязчивое связывает параметры стороны клиента в элементе Form через атрибуты данных. Вы можете их видеть? например –