Подтвердить что ты не робот

Сохранять текущую панель аккордеона jQuery после обратной передачи ASP.NET?

У меня есть jquery аккордеон на asp.net aspx weppage. Внутри панелей у меня есть кнопки asp.net. Когда я нажимаю на кнопку, на панели, в которой я был, закрывает и перезагружает страницу, по умолчанию для первой панели. Я не против перезагрузки, но есть способ сохранить текущую панель открытой после перезагрузки. Прямо сейчас, я просто вызываю аккордеон() на div с id аккордеона.

4b9b3361

Ответ 1

Вы можете использовать скрытое поле ввода, чтобы сохранить активный индекс аккордеона во время postbacks, а затем заполнить его с помощью javascript во время события изменения аккордеона.

<asp:HiddenField ID="hidAccordionIndex" runat="server" Value="0" />

<script language="javascript" type="text/javascript">
    $(function(){
        var activeIndex = parseInt($('#<%=hidAccordionIndex.ClientID %>').val());

        $("#accordion").accordion({
            autoHeight:false,
            event:"mousedown",
            active:activeIndex,
            change:function(event, ui)
            {
                var index = $(this).children('h3').index(ui.newHeader);
                $('#<%=hidAccordionIndex.ClientID %>').val(index);
            }
        });
    });
</script>

Вероятно, вы могли бы найти более эффективный способ захвата активного индекса во время события изменения, но это, похоже, работает.

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

Во время обратной передачи скрытое значение поля сохраняется в ViewState, так что, когда страница загружается снова, аккордеон инициализируется индексом последней клики, на которую нажата.

Ответ 2

Решение MaxCarey работает хорошо, но последняя версия jQuery UI (1.10.4), похоже, имеет некоторые отличия. Правильное событие теперь не "изменено", а "активировано" (или "beforeActivate", если вы хотите отменить событие).

<asp:HiddenField runat="server" ID="hidAccordionIndex" Value="0" />
...

$(document).ready(function () {
    var activeIndex = parseInt($("#<%=hidAccordionIndex.ClientID %>").val());

    $("#accordion").accordion({
        heightStyle: "content",
        active: activeIndex,
        activate: function (event, ui) {
            var index = $(this).children('h3').index(ui.newHeader);
            $("#<%=hidAccordionIndex.ClientID %>").val(index);
        }
    });
});

Для меня здесь получается, что я могу проверить, что значение hidAccordionIndex установлено на правильное значение, но при обратной передаче оно возвращается к 0 независимо от того, что я пытаюсь. Я попытался установить его на пустую строку, например, предложенную Dave.Lebr1, но она по-прежнему не сохраняется при обратной передаче.

Это должно оставаться доступным для обратной передачи, так как поле divAccordionIndex должно иметь ViewState (я проверял его включение).

Кто-нибудь еще имел успех? Это меню находится на моей главной странице, и оно отлично работает... кроме этого.

Ответ 3

записать индекс или идентификатор панели аккордеона, в котором нажата кнопка с помощью ClientScript.RegisterStartupScript. Предположим, что пользователь нажал кнопку с именем btnSubmit, которая находится в панели 3. Затем она будет работать следующим образом:

protected void btnSubmitClick(object sender, EventArgs e)
{
    //process button click

    //class this function at end:
    SetAccordionPane(3);
}

//you can call this function every time you need to set specific pane to open
//positon
private void SetAccordionPane(int idx)
{
    var s="<script type=\"text/javascript\">var paneIndex = "
      + idx +"</script">; 
    ClientScript.RegisterStartupScript(typeof(<YourPageClass>, s);
}

теперь в javascript:

$(function(){

    if(paneIndex)
    {
        $('.selector').accordion({active: paneIndex});
    }
    else
    {
        $('.selector').accordion();
    }
});

Ответ 4

Я знаю, что это поздно, но это все равно может помочь кому-то бороться с этим. Решение здесь в основном представляет собой комбинацию некоторых из вышеупомянутой мудрости.; -)

Я использую jquery-ui-1.10.4.custom.min.js и jquery-1.6.3.min.js.

 <%--the hidden field saves the active tab during a postback--%>
        <asp:HiddenField ID="hdLastActive" runat="server" Value="0" />
    </div>
</form>

и вот javaScript:

<script type="text/javascript">
$(document).ready(function () {
    // get the last active tab index -or 0 on initial pagee load- to activate the tab
    var activeTab = parseInt($("[id$='hdLastActive']").val());

    // initialize the accordion to the activeTab and set the activate event to save the last active tab index.
    $("#accordion").accordion({
        active: activeTab,
        activate: function (e) {
            // save the active tab index in the hidden field
            $("[id$='hdLastActive']").val($(this).accordion("option", "active"));                
        }
    });
});

Ответ 5

Чтобы расширить предыдущие идеи HiddenField, но без необходимости управлять вашим JS:

На вашей странице:

<asp:HiddenField runat="server" ID="hidAccordionIndex" Value="0" ClientIDMode="Static" />

В вашем JS:

$('#yourAccordion').accordion({
    heightStyle: "content"
    , active: parseInt($('#hidAccordionIndex').val())
    , activate: function (e, ui) {
        $('#hidAccordionIndex').val($(this).children('h3').index(ui.newHeader));
    }
});

Ключ ClientIDMode = "Статический". Этот подход не требует больших изменений для работы практически с любым серверным языком, потому что JS не нужно изменять, а только одно скрытое поле.

Ответ 6

Он работает на моей стороне. Пожалуйста, проверьте......

$(document).ready(function () {
    var activeIndex = parseInt($('#<%=hidAccordionIndex.ClientID %>').val());
    alert(activeIndex);
    $("#accordion").accordion({            
        active: activeIndex,
        beforeActivate: function (event, ui) {                
            var index = $(this).children('h3').index(ui.newHeader);
            $('#<%=hidAccordionIndex.ClientID %>').val(index);                
        }            
    });        
});

Ответ 7

Используйте опцию "active", когда вы создаете аккордеон. Что-то вроде этого:

$('.selector').accordion({ active: 2 });

Это активирует второй вариант в аккордеоне. Вы также можете передать селектор для выбора по id.

Ответ 8

$("#accordion").accordion({
    heightStyle: "content",
    collapsible: true,
    navigation: true
});

Установка свойства navigation на true сохранит состояние панели аккордеона.

Ответ 9

Чтобы добавить к сообщению MaxCarey...
Более надежным способом получения нового аккордеонного индекса является

change: function (event, ui) {
    var index = $(this).accordion("option", "active");
    $("#<% =hidAccordionIndex.ClientID %>').val(index);
}

Ответ 10

У меня была та же проблема, что и я. 1. Ответ MaxCarey выглядел достаточно хорошо, чтобы решить проблему, но, к сожалению, у меня не было идентификатора для моих аккордеонов. (Я использовал сторонний шаблон, они просто используют класс css). 2. Имран Х. Ашраф также был хорошим, но с той же проблемой не было доступа к аккордеонам по ID.

Моя проблема: 1. У меня был DetailsView в аккордеоне с командой Edit Update Cancel. 2. Когда я нажимаю кнопку "Изменить", она работает, но мой аккордеон закрывается.

Мое решение: 1. Я поместил один скриптовый менеджер в свою форму. 2. Я помещаю в свой аккордеон один UpdatePanel. 3. Я поместил свой DetailsView внутри UpdatePanel. 4. Что это, никакого кодирования, никакого кода, и он отлично работает.

Вот разметка html:

<div class="accordion-wrapper first-child">
<a href="javascript:void(0)" class="accordion-title orange"><span>Personal Information</span></a>
<div class="accordion" style="display: none;">
    <div class="iqb-field-area">
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:DetailsView ID="dvPersonalInfo" runat="server" Height="50px" Width="100%" AutoGenerateRows="False"
                    DataSourceID="dsPersonalInfo">
                    <Fields>
                        <asp:BoundField DataField="PTCP_FullName" HeaderText="Full Name" ReadOnly="True"
                            SortExpression="PTCP_FullName" />
                        <asp:BoundField DataField="PTCP_ContactNumber" HeaderText="Contact Number" SortExpression="PTCP_ContactNumber" />
                        <asp:BoundField DataField="PTCP_email" HeaderText="e-mail" SortExpression="PTCP_email" />
                        <asp:BoundField DataField="PTCP_PhysicalAddress" HeaderText="Physical Address" SortExpression="PTCP_PhysicalAddress" />
                        <asp:CommandField ShowEditButton="True">
                            <ControlStyle CssClass="right button" />
                        </asp:CommandField>
                    </Fields>
                </asp:DetailsView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
</div>

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

Спасибо Счастливое кодирование

Ответ 11

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

Во-первых, аккордеон не будет хранить индекс в памяти, поэтому аккордеон будет повторно инициализировать каждый раз.

Во-вторых, мне не удалось найти скрытое поле с '#<%=hidAccordionIndex.ClientID %>'

Итак, что я делаю, это

1- Установите значение по умолчанию для скрытого поля в значение null

<asp:HiddenField ID="hidAccordionIndex" runat="server" Value="" />

2- Получить активный индекс с помощью этого

Убедитесь, что parseInt, иначе он не будет работать

 var activeIndex = parseInt($('input[id$=hidAccordionIndex]').val());

Есть мой код javascript:

  $("#accordion").accordion
({
        autoHeight:false,
        event: "mousedown",
        active: activeIndex,
        collapsible: true,
        change: function (event, ui) 
        {
            var index = $(this).accordion("option", "active");
            $('input[id$=hidAccordionIndex]').val(index);
        }
});

Ответ 12

Поместите свою кнопку или сетку, которая может быть нажата или обновлена ​​на панели "Обновление". Тогда ui аккордеон будет работать штраф 100% + гарантия.. Sarath @f1

Ответ 13

        var activeIndex = parseInt($('#<%=hidAccordionIndex.ClientID %>').val());       

        $("#accordion,#inneraccordian").accordion({
            heightStyle: "content",
            collapsible: true,
            navigation: true,
            active: activeIndex,
            beforeActivate: function (event, ui) {
                var index = $(this).children('h3').index(ui.newHeader);
                $('#<%=hidAccordionIndex.ClientID %>').val(index);
            }
        });