MVC 3 Razor Динамически добавлен Ajax. Действие Link работает только первый раз в IE8 - PullRequest
1 голос
/ 26 ноября 2010

Я очень новичок в веб-разработке (около месяца) и столкнулся с чем-то странным.

Я использую VS2010, MVC 3 Razor для создания простого приложения.

У меня есть две таблицы, содержащие информацию одного типа. Как в таблице A, так и в таблице B содержатся пользователи. Разница в том, что в таблице A есть пользователи, которые находятся в «Роли», а в таблице B содержатся пользователи, не входящие в «Роль».

Обе таблицы имеют два столбца, один с именем пользователя, а другой содержит Ajax.ActionLink.

Итак, чтобы добавить пользователя в таблицу «B», я нажимаю «Ajax.Actionlink» в таблице «A». «Добавить» сохраняется с помощью действия MVC, и я перемещаю строку таблицы, используя событие AjaxOption OnSuccess. По сути, событие OnSuccess перемещает строку и изменяет Ajax.ActionLink, поэтому ActionLink новой добавленной строки пользователя будет удалять пользователя.

Надеюсь, это понятно.

Это все отлично работает. Я могу добавить пользователя «А» в таблицу «А», и все работает отлично. Я могу удалить пользователя "A" из таблицы "A" в таблицу "B", и все в порядке. Но я не могу повторно добавить пользователя А в таблицу «А». OnSuccess запускается, поэтому строка перемещается, но событие Action не вызывается. Так что, если я обновлю экран, я смогу увидеть, что движение фактически не произошло. это то же самое, если я начну с пользователя "B" в таблице "B". Кроме того, обновление страницы (F5) не исправляет ссылки, они остаются неработающими, пока я не закрою и снова не открою страницу.

В HTML все выглядит хорошо, в строке состояния видно, что при нажатии на ссылку вызывается правильный href, но fiddler не регистрирует вызов и действие не вызывается.

Я подозреваю, что у меня есть какие-то проблемы со связыванием, но я здесь потерян. В Firefox все отлично работает

Пожалуйста, помогите. Код ниже, с добавлением комментариев. Помните, что это работает для добавления и удаления, удаления и добавления, но повторное добавление и повторное удаление только вызывает функцию, но не вызывает действие. Так что я знаю, что действия написаны правильно и т. Д.

//// element is the ID of the element i am Moving
//// targetElement is the ID of the tbody i am moving the element to
function move_element(element, targetElement) {
    try 
    {
       //// get the HTM 
       var elementHTML = $("tr[id=" + element + "]").children(".Action").html();
       //// based on the tbody id
       switch (targetElement) 
       {
       case "AssignedToGroup":
            //// Change the target body for next call to this function
            elementHTML = elementHTML.replace("AssignedToGroup", "UnassignedToGroup");
            //// change th action name
            elementHTML = elementHTML.replace("AddGroupRole", "DeleteGroupRole");
            //// change the display label
            elementHTML = elementHTML.replace("Assign", "Remove");
            break;
       case "UnassignedToGroup":
            elementHTML = elementHTML.replace("UnassignedToGroup", "AssignedToGroup");
            elementHTML = elementHTML.replace("DeleteGroupRole", "AddGroupRole");
            elementHTML = elementHTML.replace("Remove", "Assign");
            break;
     }
     //// Create the new Ajax <td> element
      $("tr[id=" + element + "]").children(".Action").replaceWith("<td  class='Action'>" + elementHTML +  "</td>")
      //// Add the row to the other body
      $("tr[id=" + element + "]").appendTo($("tbody[id=" + targetElement + "]"));
   }
   catch (e) 
   {
     alert(e.Message); ////NO ERROR IS RAISED
   }
}

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Я смотрел на похожую проблему, которую вы имели, и нашел решение здесь: Проблема с кешем с Ajax.ActionLinks Подводя итог:

  • Одним из предложений было вызвать это:$.ajaxSetup({ cache: false }); Если вы используете ненавязчивую поддержку javascript для jquery.
  • Еще одним предложением было использование "HttpMethod = "POST" в AjaxOptions.

В любом случае, надеюсь, это может помочь вам или кому-то еще, поэтому я разместил это здесь.

1 голос
/ 01 декабря 2010

Не могу понять это. В итоге я просто использовал вместо этого jquery.ajax.

...