Проверка на стороне клиента в «Самопроверкаемой модели» в ASP.NET-MVC3 - PullRequest
3 голосов
/ 01 марта 2011

Это дополнительный вопрос для этого: Как DataAnnotations действительно работает в MVC? Существует пример пользовательской проверки и упоминалась «Модель самопроверки».Это довольно интересно, но я не понимаю, как написать для него проверку на стороне клиента.

Может ли мой объект модели реализовать интерфейс IClientValidateble (или это только для атрибутов dataannotation?), Я хотел бычтобы увидеть пример того, как это сделать.

Редактировать: Насколько я понимаю, «Модель самопроверки» работает без использования DataAnnotations и объявляет логику проверки внутри класса, свойства которого я проверяю, и этоне обязательно использовать атрибуты для проверки чего-либо.

Все примеры, которые я видел при пользовательской проверке на стороне клиента, касаются аннотации данных атрибут , реализующей IClientValidatable.объявляю мою логику проверки в моем классе, я не использую атрибуты для проверки состояния моделей.

Как написать проверку на стороне клиента, когда я объявляю свою логику проверки в методе Validate реализации класса моделиинтерфейс IValidatebleObject?

Может ли классЯ на самом деле перехожу к представлению реализовать интерфейс IClientValidatable или что-то подобное?

1 Ответ

2 голосов
/ 01 марта 2011

Принимая тот же ответ:

После того, как вы реализуете модель самопроверки, ведь это проверка на стороне сервера, вам нужно создать часть проверки на стороне клиента, для этого просто создайте следующие 3 шага:

  • Реализация
  • Реализация метода проверки jQuery
  • Реализация ненавязчивого адаптера

добавить к вашему IClientValidateble классу

public IEnumerable<ModelClientValidation> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelCLientValidationRule();
    rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
    rule.ValidationType = "greater"; // This is what the jQuery.Validation expects
    rule.ValidationParameters.Add("other", OtherPropertyName); // This is the 2nd parameter

    yield return rule;
}

Затем вам нужно написать новый jQuery Validator и адаптер метаданных , который свяжет jQuery.Validation с вашим кодом, предоставляя правильные атрибуты data- для этого поля (если конечно, UnobtrusiveJavaScriptEnabled верно)

создайте новый js файл и прикрепите его к <head>, например,

<script src="@Url.Content("~/Scripts/customValidation.js")" type="text/javascript"></script>

и добавьте новую проверку

jQuery.validator.addMethod("greater", function(value, element, param) {
    // we need to take value and compare with the value in 2nd parameter that is hold in param
    return Date.parse(value) > Date.parse($(param).val());
});

а потом пишем адаптер

jQuery.validator.unobtrusive.adapters.add("greater", ["other"], function(options) {
    // pass the 'other' property value to the jQuery Validator
    options.rules["greater"] = "#" + options.param.other;
    // when this rule fails, show message that comes from ErrorMessage
    options.messages["greater"] = options.message;
});

Вы можете просмотреть это в AccountModel.cs при создании нового веб-приложения MVC3, где показан этот метод, реализующий IClientValidatable

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class ValidatePasswordLengthAttribute : ValidationAttribute, IClientValidatable
{
    private const string _defaultErrorMessage = "'{0}' must be at least {1} characters long.";
    private readonly int _minCharacters = Membership.Provider.MinRequiredPasswordLength;

    public ValidatePasswordLengthAttribute()
        : base(_defaultErrorMessage)
    {
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture, ErrorMessageString,
            name, _minCharacters);
    }

    public override bool IsValid(object value)
    {
        string valueAsString = value as string;
        return (valueAsString != null && valueAsString.Length >= _minCharacters);
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[]{
            new ModelClientValidationStringLengthRule(FormatErrorMessage(metadata.GetDisplayName()), _minCharacters, int.MaxValue)
        };
    }
}
#endregion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...