Вложенный Ajax.Actionlink (InsertionMode.insertafter вызывает некоторую путаницу) - PullRequest
0 голосов
/ 22 декабря 2011

В моем приложении 3 вида (1 основной, 1 частичный, 1 вложенный частичный), и я снова и снова вызывал частичный (из основного) и вложенный частичный (из частичного)

  • ActionLink используется на главном экране

    <div id="newPackage">@Ajax.ActionLink("Create New Package", "createPackage", "test",
    new AjaxOptions
        {
            InsertionMode = InsertionMode.InsertAfter,
            HttpMethod = "post",
            UpdateTargetId = "newPackage"
        })</div>`
    


    Поток этой ссылки действия :: Когда я нажимаю эту ссылку (снова и снова), то после каждого = id = "newPackage" добавляется новый вид partail (createPackage) после каждого клика

  • ActionLink Используется внутри частичного представления createPackage (представление отображается после нажатия на ссылку в главном представлении)

       <div id="newCheck">
       @Ajax.ActionLink("add Checks", "addAnotherCheck", new AjaxOptions { InsertionMode = InsertionMode.InsertAfter, UpdateTargetId = "newCheck" })<br/><br/></div>
    


    Поток этой ссылки ActionLink :: Когда я нажимаю эту ссылку (снова и снова), то после каждого нажатия кнопки id = "newPackage" добавляется новое представление вложенного партийного элемента (addAnotherCheck)

    Т.е. основная цель - создать несколько пакетов, в каждом из которых есть несколько проверок.
    Готово со всем (вся моя работа выполнена, и мое приложение (ASP> NET MVC3) работает нормально).
    Проблема в (только в просмотре ) когда я пытаюсь создать несколько пакетов с несколькими проверками, то нажимаю на ссылку «добавить проверку» в представлении package2,3..n (вложенного частично) (исключая 1) еще одно вложенное представление «addAnotherCheck» добавляется после package1 «проверка проверки» ссылка
    но мне нужно, чтобы она добавлялась после вызова «add check»
    В скорлупе ореха :: вызов вложенного частичного снова и снова (из частичного (то есть, чтобы я звонил снова и снова из основного вида)) с ajax.actionlink (with inserttionmode.InsertAfter), который вставляет этот вложенный фрагмент только в 1-й фрагмент.

Ответы [ 2 ]

0 голосов
/ 20 марта 2013

Проблема в том, что ваш код вставляет несколько div с одним и тем же идентификатором: ваше частичное представление всегда добавляет <div id='newCheck'>...</div>, поэтому страница заканчивается заполнением div с одинаковым идентификатором.

  • Сначалаэто не законно.В HTML-документе не должно быть более одного элемента с одинаковым идентификатором.
  • Во-вторых, когда вы нажимаете "addAnotherCheck", обнаруживается только первый элемент с UpdateTargetId (поскольку предполагается, что это только один элементс таким же идентификатором).Таким образом, чек всегда вставляется после первого.Поскольку это недопустимо, каждый браузер может делать разные вещи.

Таким образом, вы должны менять идентификатор всякий раз, когда вы отображаете один и тот же фрагмент на той же странице.Вы можете просто добавить что-нибудь случайное после идентификатора и использовать один и тот же идентификатор для div и UpdateTargetId.Очевидная случайная вещь, которую можно безопасно использовать, это Guid.Для этого случая также будет работать временная метка.

0 голосов
/ 27 февраля 2012

InsertionMode = InsertionMode.InsertAfter ищет идентификатор элемента HTML.Они должны быть уникальными на вашей странице.После добавления идентификатора «newCheck» MVC Ajax находит первый.Что вам действительно нужно сделать, это поместить заполнитель в конец и использовать InsertionMode.InsertBefore.Таким образом, ваше представление будет выглядеть примерно так:

<div id="newPackage">...
<div id="newCheck" />

Затем удалите id = "newCheck" из вашего частичного представления.Теперь ваша разметка из вашего частичного представления всегда будет размещена чуть выше div с идентификатором newCheck, который всегда будет в нижней части вашей страницы.

Ваш переразмер HTML должен выглядеть примерно так:*

Это должно сработать, и теперь у вас больше не будет повторяющихся идентификаторов в вашем HTML.

...