Ошибка выполнения JavaScript: синтаксическая ошибка, нераспознанное выражение 0x800a139e
Я сталкиваюсь с этим странным поведением в моем приложении MVC 5.
У меня есть представление с несколькими Ajax.ActionLinks, которые загружают соответствующие частичные представления по событию клика.
@Ajax.ActionLink("Some text here", "_ActionName", "ControllerName", new { param = Model.Id }, ajaxOptions: new AjaxOptions { UpdateTargetId = "partialViewContainer", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, htmlAttributes: new { @id = "btn" })
Это успешно загружает частичное представление, возвращаемое _ActionName(int param) в ControllerName.. однако в консоли Chrome выдается исключение Uncaught Error: Syntax error, unrecognized expression: /ControllerName/_ActionName?param=12
Так что проблема с /ControllerName/_ActionName?param=12
выражение...
IE (все версии) выдает то же исключение, но вместо этого вызывает раздражающее всплывающее окно.
Visual Studio настроен так, чтобы разбивать все ошибки JavaScript, поэтому я предполагаю, что это ожидаемое... но я не понимаю, почему jQuery выдает это исключение... Ему не нравится выражение, сгенерированное движком Razor. В некоторых постах предлагалось перейти на версию 1.x jQuery, но это не помогло.
У меня есть другие приложения MVC с похожим подходом к загрузке частичных представлений через Ajax.ActionLinks никогда не сталкивался с этой проблемой раньше...
Дополнительная информация:
Я использую Visual Studio 2015 Pro
Библиотеки, используемые в проекте:
- JQuery-2.2.1
- начальная загрузка 3.6
- jquery.unobtrusive-Аякс
Если есть что-то еще, что я могу предоставить для лучшего понимания, пожалуйста, дайте мне знать. Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я попытался перейти на jQuery 1.7.2 и больше не получаю исключения. Это потому что..
До версии 1.9 строка считалась бы строкой HTML, если бы в ней были какие-либо теги HTML. Это может привести к непреднамеренному выполнению кода и отклонению допустимых строк селектора. Начиная с версии 1.9, строка считается HTML, только если она начинается с символа "меньше" ("<"). Плагин Migrate можно использовать для восстановления поведения до 1.9. Если известно, что строка является HTML, но может начинаться с произвольного текста, который не является тегом HTML, передайте ее в jQuery.parseHTML(), которая будет возвращать массив узлов DOM, представляющих разметку. Из этого можно создать коллекцию jQuery, например: $ ($. ParseHTML (htmlString)). Это будет считаться лучшей практикой при обработке HTML-шаблонов, например.
Простое использование буквенных строк, таких как$("<p>Testing</p>").appendTo("body")
не влияет на это изменение.
Итог: строки HTML, переданные в jQuery(), которые начинаются с чего-то отличного от символа меньше, будут интерпретироваться как селектор. Поскольку строку обычно нельзя интерпретировать как селектор, наиболее вероятным результатом будет ошибка "неверный синтаксис селектора", выдаваемая механизмом выбора Sizzle. Используйте jQuery.parseHTML() для анализа произвольного HTML.
Я не уверен, как я могу проанализировать ссылку href Ajax.ActionLink, сгенерированную движком Razor, используя parseHTML(). Также я хотел бы продолжить использование jQuery 2.x, так как Bootstrap.js 3.6 не совместим с версиями jQuery ниже 1.9...
1 ответ
Закончилось не используя @Ajax.ActionLink. Вместо этого используйте чистый вызов jQuery Ajax, как предложено @FilixMogilevsky
Теперь у меня есть
<a href="" data="@Url.Action("_ActionName", "ControllerName", routeValues: new {param = Model.Id})" class="tabLinks">Some text here...</a>
<div id ="divPartialView">
</div>
И в блоке скрипта я использую
$('.tabLinks').on('click', function() {
var url = $(this).attr('data');
$.get(url, function(data) {
$('#divPartialView').html(data);
});
});