JQuery 1.5 перерывов Сравнить Проверка (Проверка JQuery 1.8) - PullRequest
7 голосов
/ 25 февраля 2011

После обновления до JQuery 1.5 и более поздних версий 1.5.1 проверка моего сравнения завершается неудачно. Я использую JQuery.Validate 1.7. Моя ViewModel имеет следующие аннотации данных:

/// <summary>
/// Gets or sets the full name.
/// </summary>
/// <value>The full name.</value>
[Required]
[Display(Name = "fullname", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
public string FullName { get; set; }

/// <summary>
/// Gets or sets the email.
/// </summary>
/// <value>The email.</value>
[DataType(DataType.EmailAddress)]
[Display(Name = "email", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
[Required(ErrorMessageResourceName = "EmailRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages), ErrorMessageResourceName = "EmailInvalid")]
public string Email { get; set; }

/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>The password.</value>
[DataType(DataType.Password)]
[Display(Name = "password", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
[ValidatePasswordLengthAttribute(ErrorMessageResourceName = "PasswordLength", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
public string Password { get; set; }

/// <summary>
/// Gets or sets the confirm password.
/// </summary>
/// <value>The confirm password.</value>
[DataType(DataType.Password)]
[Display(Name = "confirmPassword", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
[Compare("Password", ErrorMessageResourceName = "PasswordsMustMatch", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
public string ConfirmPassword { get; set; }

Какое бы значение я ни вводил, поля пароля никогда не бывают идентичными.

ОБНОВЛЕНИЕ - ASP.NET AntiForgeryToken попадает в беду.

После дурачения в настройках точек останова FireBug я заметил, что в функции проверки equalTo, начиная со строки 1065 в jquery.validate.js, целевой элемент, который найден, не является полем пароля - но __RequestVerificationToken, который ASP.NET MVC пишет при использовании помощника Html.AntiForgeryToken().

Так что это означает, что мы даже не сравниваем правильные элементы ввода. Чтобы обойти эту проблему, я добавил грязный хак в файл jquery.validate.js:

// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
equalTo: function (value, element, param) {
    // bind to the blur event of the target in order to revalidate whenever the target field is updated
    // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
    var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function () {
        $(element).valid();
    });

    if ($(target).is("input[type=hidden]") && $(target).attr("name") == "__RequestVerificationToken") {
        var otherElementId = $(element).attr("id");
        var underScoreIndex = otherElementId.indexOf("_");
        otherElementId = otherElementId.substring(0, underScoreIndex + 1);
        otherElementId += $(element).attr("data-val-equalto-other").substring(2);

        target = $("#" + otherElementId);
    }

    return value == target.val();
}

Этот хак берет значение атрибута data-val-equalto-other и смешивает его со своим собственным идентификатором, чтобы найти правильный элемент ввода. Не будет работать во всех случаях. Но у меня работает, в приведенном выше случае.

Ответы [ 6 ]

11 голосов
/ 11 апреля 2011

Я обнаружил, что это связано с ошибкой в ​​jquery.validate.unobtrusive.js

Код в Unobtrusive добавляет адаптер equalto, который пытается найти соответствующий элемент по его атрибуту name, используяследующий код:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

Переменная fullOtherName часто (и, вероятно, всегда) имеет пространство имен с точкой, поэтому селектор jQuery возвращает слишком много входных данных и выбирает самый первый.Точка должна быть экранирована с помощью .replace (".", "\\."), Давая вам:

element = $(options.form).find(":input[name=" + fullOtherName.replace(".", "\\.") + "]")[0];

Подобная конструкция существует на несколько строк ниже, и ее также нужно исправить (а также минимизированный Javascript).

2 голосов
/ 26 августа 2012

Если это все еще актуально, у меня была та же проблема, обновлены все скрипты, и теперь она работает.Я использую следующее: Jquery 1.8 (официальная версия от их cdn), Jquery validation 1.9 и ненавязчивая проверка jquery из последнего пакета, предоставленного Microsoft на nunget (который, как ни странно, получает проверку jquery 1.8, а не 1.9).Да благословит Бог Microsoft и беспорядок, который удалось создать с 3 файлами сценариев: \

1 голос
/ 01 октября 2012

Вы можете использовать последние версии jquery и jquery.validate из Microsoft CDN.Я не вижу обновленную версию jquery.validate.unobtrusive.min.js.

Версия jquery.validate.unobtrusive.min.js, поставляемая с MVC4, работает нормально.

0 голосов
/ 07 марта 2012

Похоже, если вы посмотрите на новый код MVC4.Вы можете увидеть новую версию jquery.validate.unobtrusive.js: http://code.msdn.microsoft.com/ASPNET-MVC-4-Mobile-e99ed0ed/sourcecode?fileId=49443&pathId=640259357 Если вы делаете diff.Он точно такой же, как версия MVC3, за исключением упомянутых выше незначительных изменений, сделанных другим способом.Поэтому все, что вам нужно сделать, это заменить ваш jquery.validate.unobtrusive.js на тот, что в примере кода, и все будет работать.

Просто чтобы ты знал.Я использую Jquery 1.6.4 с Jquery mobile 1.0.1

0 голосов
/ 27 февраля 2012

В ответ на обновление MartinHN я столкнулся с той же проблемой и применил то же исправление.Поскольку я использую Nested Editor Templates, у меня в otherElementId было несколько подчеркиваний, поэтому я изменил его код, чтобы использовать lastIndexOf, а не indexOf.Например,

var underScoreIndex = otherElementId.indexOf("_");

было изменено на:

var underScoreIndex = otherElementId.lastIndexOf("_");
0 голосов
/ 01 марта 2011

С http://bassistance.de/jquery-plugins/jquery-plugin-validation/

Обратите внимание: последняя версия не пока что совместимо с jQuery 1.5.x. Вы можно найти совместимую версию в GitHub репозиторий .

Однако ни одна из веток у меня не работает ...

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