2009-06-23 2 views
6

Я получаю сообщение об ошибке «Ошибка Microsoft JScript: ошибка« Sys »не определена» на одной из моих страниц в приложении MVC при попытке вызова AJAX. Вызов AJAX производится с частичного представления, которое встроено в более чем одну страницу. Он отлично работает на всех страницах, кроме одного. У меня есть прочитанные сообщения, указывающие на параметры файла web.config и сопоставления .axd в качестве возможных решений, но приложение настроено правильно в файле web.config, а сопоставления .axd также правильны в IIS. Плюс он отлично работает на всех страницах, которые используют этот частичный вид, кроме одного. Он действует так же, как библиотеки AJAX не загружаются для этой одной страницы.ASP.NET MVC AJAX Sys - неопределенная ошибка

Ссылки на файлы сценариев находятся в общем файле site.master. Все страницы, в том числе те, которые не работают, ссылаются на одну и ту же главную страницу.

Любые идеи? Я работаю над этим уже два дня. Благодарю.

EDIT: Как указал Сэм ниже, похоже, что вызов AJAX срабатывает, прежде чем библиотеки AJAX смогут загрузить. Но вызов AJAX запускается кнопкой отправки долго после отображения страницы, поэтому библиотеки AJAX имеют достаточно времени для загрузки - извините за то, что не дали достаточно информации в первый раз.

ответ

3

Загрузите страницу в Firefox, затем используйте Firebug для проверки страницы - вы сможете увидеть все загруженные отдельные скрипты, а также все сетевые запросы, которые были выпущены, и были ли они успешными или нет. Это лучше, чем пытаться устранить проблему с точки зрения сервера.

Если вы используете IE8, вы можете использовать окно «Инструменты разработчика», но я думаю, что Firebug лучше - оба инструмента поддерживают отладку JavaScript.

Наиболее вероятная проблема заключается в том, что вы выполняете скрипт в частичном представлении до того, как скрипты, на которых он зависит, имели возможность загрузить - убедитесь, что любые вызовы скриптов, которые у вас есть внутри вашего частичного представления, будут запускаться только после страницы загружен, а не сразу во время загрузки.

+0

@Sam - Я уже посмотрел с firebug и вижу, как библиотеки Ajax загружаются, когда я нажимаю на вкладку скриптов. Однако я не знаком с Firebug, поэтому мне может что-то не хватает. Я много раз использовал скрипач, поэтому завтра позабочусь об этом, когда я доберусь до офиса, чтобы проверить, что вызов для сценариев не терпит неудачу. Поскольку вызов ajax запускается из кнопки отправки долго после отображения страницы, я бы исключал, что скрипты не имели возможности загрузить. Благодарю. – cnaegle

+0

@ Сэм - сегодня утром посмотрел с Фиддлэном и угадал, что? Путь к файлу скриптов неверен только для этой страницы. Не знаю, почему пока, но когда я положил полный путь для сценариев, страница работает отлично. Спасибо, я правильно оцениваю ваш ответ, так как он отправил меня по правильному пути - с помощью инструмента, который сказал бы мне, что мне нужно знать два дня назад :) – cnaegle

0

Добавить в web.cofig в разделе:

<remove verb="*" path="*.asmx"/> 

<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 

<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 

<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/> 

<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 

+0

Как указано выше, файл web.config настроен правильно. – cnaegle

16

Только в случае, если ... использовать следующий, чтобы избежать пути вопросы

<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.debug.js") %>" 
    type="text/javascript"></script> 
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js") %>" 
    type="text/javascript"></script> 

Источник: http://msdn.microsoft.com/en-us/library/dd381533.aspx

Спасибо, Arty

+1

Это, кажется, первое, что люди должны проверить - включают ли они файлы MicrosoftAjax.js и MicrosoftMvcAjax.js –

+0

. он работает –

0

Что касается вашего ответа на Сэма, одна вещь, которую я заметил в много MVC приложений является то, что люди не знают, как бороться с неоднозначностью относительных путей и приложения/времени выполнения. Например, переписывание URL-адресов в значительной степени гарантирует, что конкретная страница может отображаться на разных глубинах, чем вы ожидали, поэтому ../../images укажет в другом месте в зависимости от того, смотрите ли вы /products/widget или /products/widget/12345, хотя представление может быть одинаковым.Как отметил Арти, лучший способ справиться с этим - позволить движку выполнить эту работу за вас, используя утилиту URL и относительные для приложения пути, которые будут исправлены приложением независимо от контекста.

0

Я также обнаружил, что, используя следующие работы с ASP.NET MVC2.

Вместо использования MicrosoftMvcAjax.js, вы используете MicrosoftMvcValidation.js

Надеется, что это поможет кому-то.

2

Все вышеуказанные случаи одобрены. Но иногда разработчик забывает добавить файлы javascript для ajax. Так что проверьте это.

16

В web.config добавьте следующую строку кода под appsettings тэгом:

<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
+0

По какой-то причине при установке пакета nuget для Microsoft Unobtrusive Ajax это не было добавлено в мой Web.Config. Спасибо за совет. – coryrwest

+1

Вот оно! Провел все утро на этом ... –

+0

Самая распространенная ошибка. Благодаря! – mihkov

0

В принципе вы можете быть пропавшие: ссылки на файлы MicrosoftMvcAjax., MicrosoftMvcValidation.debug и MicrosoftMvcValidation JS.

Выполните следующие шаги:

  1. PM> Install-Package MicrosoftAjax

  2. PM> Install-Package MicrosoftMvcAjax.Mvc5

  3. Включите их в bundleconfig, как показано ниже:

    bundles.Add(new ScriptBundle("~/bundles/mvcFoolProof") 
         .Include("~/Scripts/MicrosoftAjax*", 
           "~/Scripts/MicrosoftMvcAjax*", 
           "~/Scripts/MicrosoftMvcValidation*", 
           "~/Scripts/mvcfoolproof*", 
           "~/Scripts/MvcFoolproofJQueryValidation*", 
           "~/Scripts/MvcFoolproofValidation*")); 
    

Теперь он должен работать без ошибок.