Синтаксическая ошибка с parseJSON во время ненавязчивой проверки

Мое приложение MVC генерирует следующий HTML-код, который вызывает синтаксическую ошибку Javascript при отправке (я ничего не ввожу в два текстовых поля). Вот сгенерированный HTML и обработчик отправки:

<form action="/UrIntake/Save" id="UrIntakeForm" method="post">

    <input data-val="true" data-val-length="The field LastName must be a string with a maximum length of 50." data-val-length-max="50" data-val-required="The LastName field is required." id="FormSubmitter_LastName" name="FormSubmitter.LastName" type="text" value="" />
    <input data-val="true" data-val-length="The field FirstName must be a string with a maximum length of 50." data-val-length-max="50" data-val-required="The FirstName field is required." id="FormSubmitter_FirstName" name="FormSubmitter.FirstName" type="text" value="" />

    <div id="SubmissionButtons" class="right">
            <input type="button" onclick="SubmitForm()" value="Submit" />
            <input type="button" onclick="CancelForm()" value="Cancel" />
    </div>
</form>

    function SubmitForm() {
        $("#UrIntakeForm").valid();
.
.
.

Это код jQuery, в котором возникает синтаксическая ошибка (v1.9.0). «данные» не определены, и в строке «возврат» возникает ошибка:

parseJSON: function( data ) {
    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

Предположительно, мне не нужно ничего вводить в текстовые поля (и тогда должно появиться сообщение «требуется поле»). Это то, что вызывает ошибку? Это не имеет смысла, но я не вижу, что еще может быть.


person birdus    schedule 11.02.2013    source источник
comment
Я не думаю, что ошибка различима из того, что вы показываете здесь. Попробуйте поставить точку останова в коде jQuery, где возникает ошибка, и просмотреть трассировку стека, чтобы увидеть, откуда она вызывается. Это даст вам подсказки о том, почему null передается этой функции.   -  person Jerry    schedule 12.02.2013
comment
Сделаю. Когда я узнаю что-то полезное, я вернусь. Спасибо.   -  person birdus    schedule 12.02.2013
comment
Пожалуйста, проголосуйте здесь, чтобы Microsoft исправила это как можно скорее: connect.microsoft.com/VisualStudio/feedback/details/776965/   -  person Leniel Maccaferri    schedule 16.02.2013
comment
Добавлен тег jquery 1.10, так как это также проблема в этом   -  person Liam    schedule 26.07.2013


Ответы (2)


Причина

Это проблема с jquery.validate.unobtrusive.js в вашем пакете ASP.NET.MVC.

Начиная с jQuery 1.9 поведение parseJSON() изменилось, и значение undefined будет считаться искаженным JSON, что приведет к указанной вами ошибке. См. Руководство по обновлению jQuery 1.9 Core для получения дополнительной информации.

Решение

Используйте плагин jQuery Migrate, что, помимо прочего, обеспечивает обратную совместимость с утилитой jQuery parseJSON().


ИЗМЕНИТЬ

Согласно официальному объявлению в этом поток в Microsoft Connect, проблема решена в последнем выпуске фреймворка.

Естественно, как отметил Андреас Ларсен в комментариях, обязательно очистите любой соответствующий кеш на стороне сервера и на стороне клиента после обновления до новой версии.

person Boaz - CorporateShillExchange    schedule 11.02.2013
comment
@birdus Нет проблем. Выпуск jQuery 1.9 вызвал множество таких проблем во многих фреймворках. - person Boaz - CorporateShillExchange; 12.02.2013
comment
Пожалуйста, проголосуйте здесь, чтобы Microsoft исправила это как можно скорее: connect.microsoft.com/VisualStudio/feedback/details/776965/ - person Leniel Maccaferri; 16.02.2013
comment
MS выпустила новые ненавязчивые и ненавязчивые пакеты ajax. функция live() заменена на on(), а также решена проблема парсинга json. - person firepol; 12.03.2013
comment
@firepol Верно. Это уже было отмечено в ответе. Полный список важных изменений, внесенных в jQuery 1.9, см. в Руководстве по обновлению jQuery Core 1.9. - person Boaz - CorporateShillExchange; 12.03.2013
comment
@firepol, можете ли вы опубликовать ссылки на новые пакеты, которые вы пробовали, которые, кажется, работают на вас? Те, что я только что получил от nuget (2.0.30116.0), похоже, ничего не решают. См. мой комментарий здесь: connect.microsoft.com/VisualStudio/feedback/details/776965/ - person Jorin; 25.03.2013
comment
Я поддерживаю это. Запуск последней версии на сегодняшний день (2.0.30116.0, опубликованной 18 февраля в nuget) не устраняет эту ошибку проверки. - person angularsen; 29.03.2013
comment
@AndreasLarsen В ветке форума вы говорите, что это проблема с кешем? - person Boaz - CorporateShillExchange; 29.03.2013
comment
Да, я только что обнаружил это. Обновление кэша браузера решило проблему. Я заметил, что динамический код, который вы видите при нарушении ошибки в Visual Studio, не соответствует новому файлу, который я только что установил через nuget. Это привело меня к выводу, что это устаревший кеш клиента. Перед этим я также удалил все папки bin и obj в надежде очистить кеш на стороне сервера от связывания javascript. Возможно, была необходима комбинация очистки как серверной, так и клиентской стороны. - person angularsen; 29.03.2013
comment
@AndreasLarsen Спасибо, я добавлю примечание в ответ. - person Boaz - CorporateShillExchange; 29.03.2013

У меня также была эта проблема. Проблема заключалась в том, что $.parseJSON(undefined) вызывает исключение, и что ненавязчивая проверка выполняла этот вызов. Как указано в принятом ответе, с тех пор это было исправлено.

Вы можете загрузить версию Microsoft этого скрипта, которая будет правильно проверяться, не вызывая исключения, по этой ссылке: http://ajax.aspnetcdn.com/ajax/mvc/5.1/jquery.validate.unobtrusive.min.js

person Travis J    schedule 23.09.2014