Подтвердить что ты не робот

Как написать пользовательскую проверку jQuery на стороне клиента в ASP.NET MVC 2 RC?

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

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

4b9b3361

Ответ 1

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

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

    case "price":

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

    break;

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

function __MVC_ApplyValidator_Price (объект, значение) {

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

}

Этого должно быть достаточно, чтобы заставить работу Фила работать.

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

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" ]);

break;

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

function __MVC_ApplyValidator_EqualTo (object, elemId) {

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

}

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

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

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

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

Ответ 2

Здесь, как добавить настраиваемую проверку jQuery:

$.validator.addMethod("noSpaces", function(value, element) {
    if ($(element).val().indexOf(" ") >= 0) {
        return false;
    } else {
        return true;
    }
}, "Value must not contain spaces");