В веб-форме 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.
Спасибо за любые предложения или идеи.