Как исправить потерю ссылки jquery веб-формы ASP.NET при частичной обратной передаче - PullRequest
1 голос
/ 03 ноября 2011

В веб-форме asp.net у меня есть несколько jquery, который контролирует расположение элементов на странице. Поскольку это веб-форма, и некоторые из этих элементов управления обращаются к серверу, чтобы заставить работать jquery, у меня есть элементы управления, вложенные в AJAX UpdatePanel для предотвращения сброса моих элементов управления постбеками.

ASPX:

<asp:UpdatePanel ID="searchupdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <div id="searchholder" >
            <div id="searchoptions">
                <a href="#" id="btnClose">Close</a> <a href="#" id="btnAdvanceSearch">Advanced Search</a>
                <br />
                <a href="#" id="btnFilters">Filters</a>
            </div>
            <div id="search" class="searchcontainer">
                <asp:TextBox ID="tbsearchterm" CssClass="watermark" runat="server" OnTextChanged="tbsearchterm_TextChanged" />
                <div class="buttons">
                    <asp:LinkButton runat="server" Text="Search" class="button search-big" ID="btnSearch" OnClick="btnSearch_Click" />
                    <asp:LinkButton runat="server" Text="Fx" class="button left big" ID="btnOperators" />
                    <asp:LinkButton runat="server" Text="Save" class="button right big" ID="btnSave" />
                </div>
            </div>
            <div id="divAdvSearch">
            </div>
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

<div id="divBody">
    <asp:UpdatePanel runat="server" UpdateMode="Always">
        <ContentTemplate>
            <div id="divSearchResults" visible="true" runat="server">
                <uc:SearchResultsControl ID="SearchResultsControl" runat="server"></uc:SearchResultsControl>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>

Когда нажата кнопка поиска, я изменяю класс css для элемента управления поиском, чтобы изменить положение моего слоя div поиска, представляющего собой панель обновления "searchudpatepanel"

searchcontrol.js

$(function () {
    $("#searchupdatePanel").addClass("searchmenubar");
    $("#btnClose").hide();
});

$(function () {
    $("#btnSearch").click(function () {
        $(".searchmenubar").animate({ "margin-top": "5px" }, "fast");
        $("#btnAdvanceSearch").show();
        $("#btnFilters").show();
        $("#btnClose").hide();
        $("#divAdvSearch").hide();
        alert("search");
    });
});

При нажатии кнопки также вызывается серверный код для извлечения и заполнения результатов в пользовательском элементе управления с именем SearchResultsControl (вторая панель обновления)

Я запутался, когда элемент управления searchResult загружен с результатами, все ссылки на классы jquery потеряны. В результате перестает работать каждый скрытый элемент div или нажатие кнопки, которое вызывается. Работая с этим в отладке, я вижу, когда пользовательский элемент управления называется Page_Load для файла default.aspx, который вызывается во второй раз. Я предполагаю, что эта частичная загрузка сбрасывает ссылку на файлы js, я просто не знаю, как это исправить.

Я попытался выполнить тест при загрузке страницы, используя IsStartupScriptRegistered, чтобы проверить, вызывается ли js

string csname = "PopupScript";
Type cstype = this.GetType();

ClientScriptManager cs = Page.ClientScript;

if (!cs.IsStartupScriptRegistered(cstype, csname))
{
    StringBuilder cstext1 = new StringBuilder();
    cstext1.Append("<script type=text/javascript> alert('Hello World!') </");
    cstext1.Append("script>");
    cs.RegisterStartupScript(cstype, csname, cstext1.ToString());
}

Здесь, при инициализации страницы, я вижу, что всплывающее окно происходит, однако при загрузке UserControl я проходил через это второй раз при загрузке страницы, но предупреждение не отображалось (полагаю, это связано с частичная загрузка, поэтому браузер считает, что скрипт уже зарегистрирован).

Единственное, о чем я могу думать, это переопределение рендеринга загружаемого UserControl, так как он загружает пользовательский набор результатов.

protected override void Render(HtmlTextWriter htw)
{
    if (IsPostBack)
    {
        QueryResponse qr = iu.GetSearchResults(SearchTerm);
        int num = qr.TotalMatchesReturned;

        SearchData sd = new SearchData();
        htw.Write("<table style='width: 100%; height:100%'><tr ><td style='width: 50%'>");
        htw.Write("<div id='divResultDetail' runat=server >");
        htw.Write("<script type='text/javascript' src='../js/paging.js'></script><div id='pageNavPosition'></div><table id='results'>");

        for (int i = 0; i < num; i++)
        {
            ...edited for brevity.

Какие-либо предложения или указания относительно того, почему я теряю ссылку на функции jquery? Я не использую главные страницы, поэтому я не использовал ASP ScriptManager.

До использования UpdatePanel s все работало нормально. Я определяю «хорошо» как: постбэк каждый раз перезагружал / регистрировал js-файлы, поэтому они сбрасывались (что было нормально). Тем не менее, теперь с некоторыми другими необходимыми изменениями мне нужно взглянуть на использование UpdatePanel s.

Спасибо за любые предложения или идеи.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

Вы можете использовать методы live или delegate jQuery, чтобы привязать обработчики к любым элементам, добавляемым на страницу.

В качестве альтернативы, если вам нужно, чтобы некоторые настройки всегда происходили после каждого частичногопостбэк в дополнение к исходной загрузке страницы, вы можете поместить его в метод pageLoad вместо document.ready.ASP.NET вызывает это при загрузке страницы и после каждой частичной обратной передачи.

function pageLoad()
{
    // Setup code here
}

Дополнительные сведения см. В этой статье: http://encosia.com/document-ready-and-pageload-are-not-the-same/

1 голос
/ 03 ноября 2011

Вам нужно использовать delegate для нажатия кнопки.Это гарантирует, что все элементы настоящего и будущего будут связаны с обработчиком событий.

http://api.jquery.com/delegate/

$("body").delegate("#btnSearch", "click", function () {
    $(".searchmenubar").animate({ "margin-top": "5px" }, "fast");
    $("#btnAdvanceSearch").show();
    $("#btnFilters").show();
    $("#btnClose").hide();
    $("#divAdvSearch").hide();
    alert("search");
});
0 голосов
/ 03 ноября 2011

Вам необходимо перепривязать элементы, когда панель обновления закончит обновление.Вот так

var prm = Sys.WebForms.PageRequestManager.getInstance();

    prm.add_endRequest(function () {
        $('#add').click(function () {              
        });

        $('#addPrevious').click(function () {               
        });
    });

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...