Как написать пользовательскую проверку JQuery на стороне клиента в ASP.NET MVC 2 RC? - PullRequest
12 голосов
/ 11 января 2010

Я прочитал Пост Фила Хаака о пользовательской проверке на стороне клиента в ASP.NET MVC 2. Я хочу сделать то же самое, но с адаптером jQuery и использованием ASP.NET MVC 2 RC ( в отличие от бета-версии MVC 2, которую использует пост). Кто-нибудь смог понять, как это сделать?

Я специально хочу выполнить проверку соответствия пароля (то есть пароль и подтверждение пароля должны совпадать). Шаблон проекта ASP.NET MVC 2 RC VS.NET показывает, как реализовать это на стороне сервера (используя PropertiesMustMatchAttribute), но не на стороне клиента.

Ответы [ 3 ]

15 голосов
/ 27 февраля 2010

Я полагаю, что вы уже следовали инструкциям Фила Хаака http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx) о том, как получить пользовательскую проверку при работе с проверкой клиента MS AJAX. Чтобы он работал с jQuery, вам нужно изменить файл MicrosoftMvcJQueryValidation.js:

  • В функции __MVC_CreateRulesForField (validationField) вам необходимо добавить оператор case. Продолжая пример Фила, вам нужно добавить:

    чехол "цена":

    __ MVC_ApplyValidator_Price (rulesObj, thisRule.ValidationParameters ["min"]);

    перерыв;

  • Затем вам нужно будет создать функцию __MVC_ApplyValidator_Price:

функция __MVC_ApplyValidator_Price (объект, значение) {

// min is what jQuery Validate uses to validate for minimum values
object["min"] = value;

}

Этого должно быть достаточно, чтобы пример Фила работал.

Теперь, что касается вашей проверки PropertiesMustMatchAttribute, не похоже, что MVC генерирует определение проверки JSON на стороне клиента для атрибутов, которые украшают классы. Поскольку PropertiesMustMatchAttribute должен использоваться в модели (а не в свойстве), я не могу понять, как заставить его запускать проверку на стороне клиента. Вместо этого я выбрал другой подход. Я создал фиктивный атрибут проверки, перегрузка которого IsValid () всегда возвращает true, и использовал этот атрибут в свойстве. Это просто фиктивный атрибут, который делегирует логику валидации в функцию equalTo валидатора jQuery. Вот фиктивный атрибут:

public class PropertiesMustMatchClientTriggerAttribute : ValidationAttribute
{
    public string MatchProperty { get; set; }

    public PropertiesMustMatchClientTriggerAttribute(string matchProperty)
    {
        MatchProperty = matchProperty;
        ErrorMessage = "{0} doesn't match {1}.";
    }
    public override bool IsValid(object value)
    {
        return true;
    }

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

Вот пользовательский валидатор:

public class PropertiesMustMatchClientTriggerValidator : DataAnnotationsModelValidator<PropertiesMustMatchClientTriggerAttribute>
{
    private string _message;
    private string _matchProperty;

    public PropertiesMustMatchClientTriggerValidator(ModelMetadata metaData, ControllerContext context, PropertiesMustMatchClientTriggerAttribute attribute)
        : base(metaData, context, attribute)
    {
        _message = attribute.FormatErrorMessage(metaData.DisplayName);
        _matchProperty = attribute.MatchProperty;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = _message,
            ValidationType = "equalTo"
        };
        rule.ValidationParameters.Add("matchField", _matchProperty);

        return new[] { rule };
    }
}

указанный пользовательский валидатор должен быть зарегистрирован в Application_Start () для блога Фила:

DataAnnotationsModelValidatorProvider.RegisterAdapter (typeof (PropertiesMustMatchClientTriggerAttribute), typeof (PropertiesMustMatchClientTriggerValidator));

Наконец, вам нужно изменить файл MicrosoftMvcJQueryValidation.js:

  • Добавьте следующий оператор case в __MVC_CreateRulesForField:

case "equalTo":

__ MVC_ApplyValidator_EqualTo (rulesObj, thisRule.ValidationParameters ["matchField"]);

перерыва;

  • добавить эту функцию:

function __MVC_ApplyValidator_EqualTo (object, elemId) {

object["equalTo"] = document.getElementById(elemId);

}

Теперь вам нужно прикрепить фиктивный атрибут проверки к свойству:

    [PropertiesMustMatchClientTrigger("Password")]
    public string ConfirmPassword { get; set; }

Это должно сделать это.

Создание этого фиктивного атрибута немного уродливо, поэтому я надеюсь, что кто-то может найти более элегантное решение.

1 голос
/ 11 января 2010

Вот как добавить пользовательскую проверку jQuery:

$.validator.addMethod("noSpaces", function(value, element) {
    if ($(element).val().indexOf(" ") >= 0) {
        return false;
    } else {
        return true;
    }
}, "Value must not contain spaces");
0 голосов
/ 03 мая 2012

Я знаю, что это старый пост, и вы используете / используете MVC2, но MVC3 теперь поставляется с атрибутом CompareAttribute, который можно использовать в вашем случае совпадения при подтверждении пароля.

Источник: http://www.nickriggs.com/posts/asp-net-mvc-3-data-annotations-provide-property-level-contingent-validation/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...