2016-03-09 5 views
1

Я сталкиваюсь с этим странным поведением в моем приложении MVC 5.Ошибка выполнения JavaScript: ошибка синтаксиса, нераспознанное выражение 0x800a139e

У меня есть вид с несколькими Ajax.ActionLinks, которые загружают соответствующие частичные виды на событие click.

@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 (ИНТ пары) в 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-Аякс

Если есть что-нибудь еще я могу предоставить для лучшего понимания, пожалуйста, дайте мне знать. Заранее спасибо!

EDIT:

Я попытался понижая к JQuery 1.7.2, и я больше не получаю исключение. Это потому, что ..

from the notes

Prior to 1.9, a string would be considered to be an HTML string if it had HTML tags anywhere within the string. This has the potential to cause inadvertent execution of code and reject valid selector strings. As of 1.9, a string is only considered to be HTML if it starts with a less-than ("<") character. The Migrate plugin can be used to restore the pre-1.9 behavior. If a string is known to be HTML but may start with arbitrary text that is not an HTML tag, pass it to jQuery.parseHTML() which will return an array of DOM nodes representing the markup. A jQuery collection can be created from this, for example: $($.parseHTML(htmlString)). This would be considered best practice when processing HTML templates for example.
Simple uses of literal strings such as $("<p>Testing</p>").appendTo("body") are unaffected by this change.
Bottom line: HTML strings passed to jQuery() that start with something other than a less-than character will be interpreted as a selector. Since the string usually cannot be interpreted as a selector, the most likely result will be an "invalid selector syntax" error thrown by the Sizzle selector engine. Use jQuery.parseHTML() to parse arbitrary HTML.

Я не знаю, как я могу разобрать HREF ссылку Ajax.ActionLink генерируемый двигателем Razor с помощью parseHTML(). Также я хотел бы продолжить использование jQuery 2.x, поскольку Bootstrap.js 3.6 несовместим с версиями jQuery ниже 1,9 ...

+1

Почему вы не просто использовать чистый JQuery, чтобы сделать вызов Ajax , Вместо этого вы используете абстракцию для создания этого вызова. Сделайте что-то вроде $ .post ('controller/action', {id: id}, function (data) {}); –

+0

Я могу это сделать, но он просто становится слишком неуклюжим ... То, что я не понимаю, я использовал подобный подход раньше и никогда не приходилось иметь дело с этой ситуацией ... – Johny

+0

@FilixMogilevsky закончил работу так, как вы предполагали ... Мне лично не нравится такой подход, но он работает. Спасибо, что нашли время для комментариев! :) Приветствия – Johny

ответ

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); 
    }); 
});