Ajax.ActionLink дважды вызывает контроллер

#asp.net #ajax #asp.net-mvc-3

#asp.net #ajax #asp.net-mvc-3

Вопрос:

Когда я нажимаю на Ajax.ActionLink дважды вызывает мой контроллер.

 <td id = @tdTag>
   @Ajax.ActionLink("LL-"   item.getProjectAbbreviation(item.projectID.Value)   "-"   item.prjLessonID, "Details",
                    new { id = item.lessonID },
                    new AjaxOptions
                        {
                          HttpMethod = "POST",
                          UpdateTargetId = "details",
                          InsertionMode = InsertionMode.InsertAfter ,
                          OnSuccess = "showDetails()"

                         }) 
  

Мой контроллер выглядит следующим образом…

    public ActionResult Details(int id)
    {
        using (LLDataContext storeDB = new LLDataContext())
        {
            var lesson = (from l in storeDB.lessons
                          where l.lessonID == id
                          select l).SingleOrDefault();

            return PartialView(lesson);

        }
    }
  

Комментарии:

1. Можете ли вы предоставить реализацию метода showDetails на javascript?

Ответ №1:

Я только что столкнулся с этой же проблемой и обнаружил, что у меня «jquery.unobtrusive-ajax.js » загружено дважды. Я удалил второй экземпляр, и все работает хорошо. Чтобы увидеть это в действии, просто добавьте это три раза и создайте @Ajax.ActionLink(…) с опцией подтверждения ajax. Вы получите подтверждение несколько раз.

 <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
  

Комментарии:

1. Большое вам спасибо за ваше решение, сэкономьте мне много времени.

2. Да, это была проблема! (В моем случае обновление ajax страницы повторно включало этот js-файл при каждом запуске обновления. Переместил включение за пределы html, возвращаемого этим вызовом ajax, и проблема исчезла.)

3. Если вы используете пакеты, и вы включили проверку с помощью следующего кода: пакеты. Добавить(новый ScriptBundle(«~/bundles/jqueryval»). Включить(«~/Scripts/jquery.unobtrusive*», «~/Scripts/jquery.validate *»)); Это может вызвать аналогичное поведение, укажите js без *

4. Супер, сэкономил много времени!, да, он был загружен два раза, и теперь проблема исчезла !….

5. @anAgent Это не решает мою проблему, но дает мне подсказку, как решить мою проблему. Спасибо!

Ответ №2:

используйте любой из только одного js, а не оба

 <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
  

или

 <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>
  

Это решит ваши проблемы.

Ответ №3:

Ответ anAgent помог мне решить эту проблему, но в качестве дополнения я упомяну, что в моем случае множественные ссылки на «jquery.unobtrusive-ajax.js «были в разных файлах; один был в MyView.cshtml, а другой был в _Layout.cshtml.

Ответ №4:

Убедитесь, что вы включили на свою страницу ненавязчивый скрипт jquery (в дополнение к jquery):

 <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
  

и что вы включили ненавязчивый javascript в своем web.config

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

Также для дальнейшей диагностики таких проблем я бы порекомендовал вам использовать какой-нибудь инструмент, который позволил бы вам точно видеть, что происходит на уровне HTTP. FireBug более чем превосходен для такого рода анализа. Он также покажет любые возможные ошибки javascript, которые у вас могут быть, он покажет или нет AJAX-запросы, которые предоставят вам дополнительную информацию о том, выполняется AJAX-запрос или обычный запрос, … полезные вещи.

Комментарии:

1. @crocaduck81, ты видишь запрос AJAX, отправленный в FireBug?

2. Я делаю, он отправляет запрос дважды.

Ответ №5:

просто проверьте эту ссылку на jquery

 src="~/Scripts/jquery.unobtrusive-ajax.min.js"
  

может быть, вы добавляете в представление дважды
или

 bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
    "~/Scripts/jquery.unobtrusive*",