不执行UpdatePanel的启动脚本脚本、UpdatePanel

2023-09-10 18:01:45 作者:懂得失去

我正在写在SharePoint网站使用ASP.NET web部件,并试图用一个UpdatePanel呈现查询结果。我想用一个jQuery插件修改从异步回发返回的表,但我遇到了麻烦的启动脚本在异步UDPATE执行。

我发现这个职位,而表示在UpdatePanel不会做启动脚本一个eval();相反,你必须注册使用ScriptManager 启动脚本块。这一切都有道理,直到它不能正常工作。该 MSDN的参考文档似乎同意,并采取有办法。

我的控制过长后完全,但这里有一个精简的重presentation,我认为涉及任何有关。请原谅我,如果有遗漏控制在下面贴 - 我不得不删除一些地区,并有可能成为某些晃来晃去的触角,可以这么说。下面是code的web部件,这是没有什么不同,它加载一个用户控件的SmartPart(的.ascx)。

正如你所看到的,我现在用的是ScriptManager.RegisterStartupScript方法。我都试过过载;一次页面,并一度为ListView(更名为AspListView),这是在更新面板。在两种情况下不启动脚本上的异步更新执行,而我在为什么不知所措。

 使用系统;
System.Collections中使用;
使用System.Collections.Generic;
使用System.Linq的;
使用了System.Runtime.InteropServices;
使用System.Text;
使用System.Web.UI程序;
使用System.Web.UI.WebControls;
使用System.Web.UI.WebControls.WebParts;
使用的System.Xml.Serialization;

使用Microsoft.SharePoint程序;
使用Microsoft.SharePoint.WebControls;
使用Microsoft.SharePoint.WebPartPages;

命名空间了myNameSpace
{
    使用AspListView = System.Web.UI.WebControls.ListView;

    [的Guid(601b3bdb-ed2a-4ec8-8a40-c37de8ab048d)]
    公共类ListSearch:StaticTemplateWebPart
    {
        私人AspListView resultsList;

        公共ListSearch()
        {
        }

        保护覆盖无效的CreateChildControls()
        {
            base.CreateChildControls();

            ScriptLink.Register(页,jQuery的-1.3.2.js,假);
            ScriptLink.Register(页的jQuery UI的1.7.2.custom.min.js,假);
            ScriptLink.Register(页,jquery.timepickr.js,假);
            ScriptLink.Register(页,jquery.quicksearch.js,假);

            字符串脚本块=
@
如果($('#表的差异,结果)。长)
{
    $('#表的差异,结果TR')。快速搜索({
        位置:之前,
        附:table.results,
        stripeRowClass:奇,偶]
        labelText:关键字搜索
    });
};
            ScriptManager.RegisterStartupScript(页的typeof(页),UniqueID的,脚本块,真);

            / *添加其他控件,获得引用,数据绑定等。* /

        }

        无效searchButt_Click(对象发件人,EventArgs的)
        {
            如果(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]的项目;

                VAR的结果= SearchListItems(DataList控件,beginDT,endDT,keywordText.Text ??);
                如果(results.Count大于0)
                {
                    resultsList.DataSource =结果;
                    resultsList.DataBind();
                }
            }
        }
    }
}
 

这被加载的用户控件:

 <%@控制语言=C#类名=ListSearchControl%>

<如果%(假)
   {%>
    <脚本的src =../../设计/ jQuery的-1.3.2-vsdoc2.js类型=文/ JavaScript的>< / SCRIPT>
<%}%GT;

<脚本类型=文/ JavaScript的>
    $(函数(){
        $('身份证')的触发器(点击);
        $('#&其中;%= BeginTime.ClientID%GT;')。timepickr({
            处理:#<%= BeginTimeTrigger.ClientID%>',
            约定:12,
            触发:无
        });
        $('#&其中;%= EndTime.ClientID%GT;')。timepickr({
            处理:#<%= EndTimeTrigger.ClientID%>',
            约定:12,
            触发:无
        });
    });
< / SCRIPT>

< ASP:面板ID =ControlPanel控制面板=服务器>
    < ASP:面板ID =输入=服务器>
        < ASP:面板的CssClass =DateInputWrapper=服务器>
            < ASP:面板的CssClass =BeginDateInput=服务器>
                < ASP:标签文本=开始时间:=服务器/>
                < ASP:文本框ID =BEGINDATE列=14=服务器>< / ASP:文本框>
                < ASP:图片ID =BeginDateImg的ImageUrl =/ _布局/图片/ calendar.gif=服务器/>
                < AJAX:CalendarExtender ID =BeginDateExtender的TargetControlID =BEGINDATEPopupButtonID =BeginDateImg
                                       格式=MMMM研发,YYYY=服务器>
                < / AJAX:CalendarExtender>
                < ASP:标签文本=开始时间:=服务器/>
                < ASP:文本框ID =的BeginTime列=6文本=凌晨04:00=服务器>< / ASP:文本框>
                < ASP:图片ID =BeginTimeTrigger=服务器的ImageUrl =/ _布局/ 1033 /图片/ clock.png/>
            < / ASP:面板>
            < ASP:面板的CssClass =EndDateInput=服务器>
                < ASP:标签文本=结束日期:=服务器/>
                < ASP:文本框ID =结束日期列=14=服务器>< / ASP:文本框>
                < ASP:图片ID =EndDateImg的ImageUrl =/ _布局/图片/ calendar.gif=服务器/>
                < AJAX:CalendarExtender ID =EndDateExtender的TargetControlID =结束日期PopupButtonID =EndDateImg
                                       格式=MMMM研发,YYYY=服务器>
                < / AJAX:CalendarExtender>
                < ASP:标签文本=结束时间:=服务器/>
                < ASP:文本框ID =结束时间列=6文本=上午3时59分=服务器>< / ASP:文本框>
                < ASP:图片ID =EndTimeTrigger=服务器的ImageUrl =/ _布局/ 1033 /图片/ clock.png/>
            < / ASP:面板>
        < / ASP:面板>
        < ASP:面板的CssClass =提交=服务器>
            < ASP:按钮的ID =SearchButton文本=搜索=服务器/>
            < ASP:标签的CssClass =SearchStatusText=服务器/>
        < / ASP:面板>
    < / ASP:面板>
< / ASP:面板>

< ASP:面板ID =ResultsPanel=服务器>
    < ASP:ListView控件ID =ResultsList=服务器>
        < LayoutTemplate模板>
            <表ID =差距,结果>
                < TR类=标题行>
                    <第i个预定日期/时间< /第i个
                    <第i code< /第i个
                    百分位>简介< /第i个
                < / TR>
                < ASP:占位符=服务器ID =itemPlaceHolder/>
            < /表>
        < / LayoutTemplate模板>
        <的ItemTemplate>
            < TR类=结果排>
                < TD><%#的eval(ScheduledDate)%>< / TD>
                < TD><%#的eval(code)%>< / TD>
                < TD><%#的eval(说明)%>< / TD>
            < / TR>
        < / ItemTemplate中>
    < / ASP:ListView控件>
< / ASP:面板>

< ASP:面板ID =DetailsPanel=服务器>
< / ASP:面板>
 

用它打了一下后解决方案

,我得到它的工作。我认为,问题是,我只是利用快速搜索()不正确莫名其妙。后来我用一个简单的警报()尝试它工作得很好。感谢您的建议!

设置脚本执行顺序

I'm writing an ASP.NET webpart for use in a SharePoint site and trying to use an UpdatePanel to render query results. I want to use a JQuery plugin to modify the table returned from the asynchronous postback, but I'm having trouble getting the startup script to execute on the asynchronous udpate.

I found this post which indicates that the UpdatePanel won't do an eval() on startup scripts; instead, you must register the startup script block with the ScriptManager. It all makes sense until it doesn't work. The MSDN reference documentation seems to concur with the approach taken there.

My control is too long to post completely, but here's a trimmed-down representation that I think covers anything relevant. Forgive me if there are missing controls in the paste below - I had to remove some parts, and there may be some dangling tentacles, so to speak. The below is the code for the webpart, which is not unlike the SmartPart which loads a user control (.ascx).

As you can see, I am using the ScriptManager.RegisterStartupScript method. I've tried both overloads; once for the Page, and once for the ListView (renamed as 'AspListView') which is in the update panel. In neither case does the startup script execute on the asynchronous update, and I'm at a loss for why.

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();
                }
            }
        }
    }
}

And the user control that gets loaded:

<%@ 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>

解决方案

after playing with it a bit, I got it to work. I think the problem was that I was just using quicksearch() incorrectly somehow. I tried later with a simple alert() and it worked fine. Thanks for the suggestions!