Скрипт запуска UpdatePanel не выполняется - PullRequest
3 голосов
/ 30 октября 2009

Я пишу веб-часть ASP.NET для использования на сайте SharePoint и пытаюсь использовать UpdatePanel для отображения результатов запроса. Я хочу использовать плагин JQuery, чтобы изменить таблицу, возвращаемую из асинхронной обратной передачи, но у меня возникают проблемы с запуском сценария запуска для асинхронного обновления.

Я нашел этот пост, который указывает, что UpdatePanel не будет выполнять eval () для сценариев запуска; вместо этого вы должны зарегистрировать блок сценария запуска в ScriptManager . Все это имеет смысл, пока не сработает. Справочная документация MSDN, похоже, совпадает с принятым там подходом.

Мой контроль слишком длинный, чтобы полностью публиковать сообщения, но вот урезанное представление, которое, я думаю, охватывает что-либо важное. Простите, если в приведенной ниже пасте отсутствуют элементы управления - мне пришлось удалить некоторые части, и, так сказать, могут быть некоторые висячие щупальца. Ниже приведен код веб-части, который мало чем отличается от SmartPart, который загружает пользовательский элемент управления (.ascx).

Как видите, я использую метод ScriptManager.RegisterStartupScript. Я пробовал обе перегрузки; один раз для страницы и один раз для ListView (переименованного в «AspListView»), который находится на панели обновления. Ни в том, ни в другом случае сценарий запуска не выполняется при асинхронном обновлении, и я не понимаю, почему.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace MyNamespace
{
    using AspListView = System.Web.UI.WebControls.ListView;

    [Guid("601b3bdb-ed2a-4ec8-8a40-c37de8ab048d")]
    public class ListSearch : StaticTemplateWebPart
    {
        private AspListView resultsList;

        public ListSearch()
        {
        }

        protected override void CreateChildControls()
        {            
            base.CreateChildControls();

            ScriptLink.Register(Page, "jquery-1.3.2.js", false);
            ScriptLink.Register(Page, "jquery-ui-1.7.2.custom.min.js", false);
            ScriptLink.Register(Page, "jquery.timepickr.js", false);
            ScriptLink.Register(Page, "jquery.quicksearch.js", false);

            string scriptBlock =
@"
if ($('table#discrepancy-results').length)
{
    $('table#discrepancy-results tr').quicksearch({
        position: 'before',
        attached: 'table.results',
        stripeRowClass: ['odd', 'even'],
        labelText: 'Keyword Search'
    });
}";
            ScriptManager.RegisterStartupScript(Page, typeof(Page), UniqueID, scriptBlock, true);

            /* adding other controls, getting references, databinding, etc. */

        }             

        void searchButt_Click(object sender, EventArgs e)
        {           
            if (Page.IsPostBack)
            {
                var beginDT = DateTime.Parse((beginDateText.Text ?? "") + " " + (beginTimeText.Text ?? ""));
                var endDT = DateTime.Parse((endDateText.Text ?? "") + " " + (endTimeText.Text ?? ""));
                var dataList = SPContext.Current.Web.Lists["MyDataList"].Items;

                var results = SearchListItems(dataList, beginDT, endDT, keywordText.Text ?? "");
                if (results.Count > 0)
                {
                    resultsList.DataSource = results;
                    resultsList.DataBind();
                }
            }
        }
    }
}

И пользовательский элемент управления, который загружается:

<%@ Control Language="C#" ClassName="ListSearchControl" %>

<% if (false)
   { %>
    <script src="../../LAYOUTS/jquery-1.3.2-vsdoc2.js" type="text/javascript"></script>    
<% } %>

<script type="text/javascript">
    $(function() {
        $('id').trigger('click');
        $('#<%= BeginTime.ClientID %>').timepickr({
            handle: '#<%= BeginTimeTrigger.ClientID %>',
            convention: 12,
            trigger: 'nothing' 
        });
        $('#<%= EndTime.ClientID %>').timepickr({
            handle: '#<%= EndTimeTrigger.ClientID %>',
            convention: 12,
            trigger: 'nothing'
        });        
    });
</script>

<asp:Panel ID="ControlPanel" runat="server">
    <asp:Panel ID="Inputs" runat="server">
        <asp:Panel CssClass="DateInputWrapper" runat="server">
            <asp:Panel CssClass="BeginDateInput" runat="server">
                <asp:Label Text="Begin Date: "  runat="server" />   
                <asp:TextBox ID="BeginDate" Columns="14" runat="server"></asp:TextBox>     
                <asp:Image ID="BeginDateImg" ImageUrl="/_layouts/Images/calendar.gif" runat="server" />
                <ajax:CalendarExtender ID="BeginDateExtender" TargetControlID="BeginDate" PopupButtonID="BeginDateImg" 
                                       Format="MMMM d, yyyy" runat="server">
                </ajax:CalendarExtender>
                <asp:Label Text="Begin Time: " runat="server" />
                <asp:TextBox ID="BeginTime" Columns="6" Text="04:00 am" runat="server"></asp:TextBox>
                <asp:Image ID="BeginTimeTrigger" runat="server" ImageUrl="/_layouts/1033/Images/clock.png" />                        
            </asp:Panel>                    
            <asp:Panel CssClass="EndDateInput" runat="server">
                <asp:Label Text="End Date: " runat="server" />                        
                <asp:TextBox ID="EndDate" Columns="14" runat="server"></asp:TextBox>     
                <asp:Image ID="EndDateImg" ImageUrl="/_layouts/Images/calendar.gif" runat="server" />
                <ajax:CalendarExtender ID="EndDateExtender" TargetControlID="EndDate" PopupButtonID="EndDateImg" 
                                       Format="MMMM d, yyyy" runat="server">
                </ajax:CalendarExtender>
                <asp:Label Text="End Time: " runat="server" />
                <asp:TextBox ID="EndTime" Columns="6" Text="03:59 am" runat="server"></asp:TextBox>
                <asp:Image ID="EndTimeTrigger" runat="server" ImageUrl="/_layouts/1033/Images/clock.png" />
            </asp:Panel>   
        </asp:Panel>         
        <asp:Panel CssClass="Submit" runat="server">
            <asp:Button ID="SearchButton" Text="Search" runat="server" />
            <asp:Label CssClass="SearchStatusText" runat="server" />
        </asp:Panel>       
    </asp:Panel>
</asp:Panel>

<asp:Panel ID="ResultsPanel" runat="server">
    <asp:ListView ID="ResultsList" runat="server">
        <LayoutTemplate>            
            <table id="discrepancy-results">
                <tr class="header-row">                    
                    <th>Scheduled Date/Time</th>                   
                    <th>Code</th>     
                    <th>Description</th>               
                </tr>                
                <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
            </table>            
        </LayoutTemplate>
        <ItemTemplate>
            <tr class="result-row">                
                <td><%# Eval("ScheduledDate") %></td>                
                <td><%# Eval("Code") %></td>         
                <td><%# Eval("Description") %></td>
            </tr>
        </ItemTemplate>
    </asp:ListView>
</asp:Panel>

<asp:Panel ID="DetailsPanel" runat="server">
</asp:Panel>

Ответы [ 4 ]

6 голосов
/ 27 сентября 2011

Я хотел бы добавить, что сценарии запуска панели обновления не будут работать для нас, если вы не используете UpdatePanel's ID и typeof(UpdatePanel). Использование скриптов запуска в других местах за пределами панели обновления не было таким суетливым. У нас это работает так:

ScriptManager.RegisterStartupScript(UpdatePanelId, typeof(UpdatePanel), "myScript",
                    / *
                      * Register a startup script to run 
                      * on the client after running this method on the server
                      * /
                    @" alert('Add your function to replace this.');", true);

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

4 голосов
/ 30 октября 2009

Вместо использования ScriptManager.RegisterStartupScript вы можете попробовать кое-что еще. Зарегистрируйтесь для участия в событии UpdatePanel end_request и выполните сценарий jQuery:

// This could also be done in jQuery's $(document).ready
function pageLoad() {
    Sys.WebForms
       .PageRequestManager
       .getInstance()
       .add_endRequest(endRequestHandler);
}

function endRequestHandler(sender, args) {
    // Shouldn't the next test be: 
    // $('table#discrepancy-results').length > 0 ???
    // and is it necessary at all? I suppose the quicksearch plugin
    // won't apply on empty array

    if ($('table#discrepancy-results').length) {
        $('table#discrepancy-results tr').quicksearch({
            position: 'before',
            attached: 'table.results',
            stripeRowClass: ['odd', 'even'],
            labelText: 'Keyword Search'
        });
    }
}
1 голос
/ 21 октября 2012

ScriptManager.RegisterStartupScript принимает параметр key , который вы устанавливаете для UniqueID элемента управления. Этот ключ должен быть уникальным во время выполнения скриптов страницы. Итак, вы должны изменить эту строку:

ScriptManager.RegisterStartupScript(Page, typeof(Page), UniqueID, scriptBlock, true);

с

ScriptManager.RegisterStartupScript(Page, typeof(Page), Guid.NewGuid(), scriptBlock, true);

или каким-либо другим способом создания уникальных ключей.

0 голосов
/ 31 октября 2009

немного поиграв с ним, я получил его на работу. Я думаю, что проблема была в том, что я просто как-то неправильно использовал quicksearch (). Я попробовал позже с простым alert (), и он работал нормально. Спасибо за предложения!

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