2009-10-30 204 views
3

我在寫一個ASP.NET webpart用於SharePoint網站,並試圖使用UpdatePanel來呈現查詢結果。我想使用JQuery插件來修改從異步回發返回的表,但我在獲取啓動腳本在異步udpate上執行時遇到問題。UpdatePanel啓動腳本不執行

我發現這個帖子indicates that the UpdatePanel won't do an eval() on startup scripts; instead, you must register the startup script block with the ScriptManager。這一切都是有道理的,直到它不起作用。 MSDN reference documentation seems to concur與採取的方法。

我的控件太長,無法完全發佈,但這裏有一個我認爲涵蓋任何相關內容的簡化表示。請原諒我,如果在下面的貼上缺少控件 - 我必須移除一些部件,並且可能會有一些懸掛觸手,可以這麼說。以下是webpart的代碼,與加載用戶控件(.ascx)的SmartPart不同。

正如您所看到的,我使用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> 
+0

當您查看呈現的頁面的源代碼時,是否存在某處的JavaScript?這可能會給一些線索...... – codeulike

+0

玩了一下之後,我就開始工作了。我認爲問題在於我只是在某種程度上錯誤地使用了quicksearch()。我稍後嘗試了一個簡單的alert(),它工作正常。 –

回答

0

用它打了一下後,我得到它的工作。我認爲問題在於我只是在某種程度上錯誤地使用了quicksearch()。我稍後嘗試了一個簡單的alert(),它工作正常。感謝您的建議!

3

除了在此處使用ScriptManager.RegisterStartupScript的是別的東西,你可以嘗試。註冊爲end_request事件在UpdatePanel和執行你的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' 
     }); 
    } 
} 
6

我想補充說,updatepanel startupscripts不會對我們有效,除非您使用UpdatePanel's IDtypeof(UpdatePanel)。在updatepanel之外的其他地方使用startupscript並不那麼挑剔。我們得到了這方面的工作是這樣的:

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

由達林提出的解決方案將工作爲好,但在我們的例子中的UpdatePanel有更多的功能,將需要額外的邏輯來「跟蹤」做了哪些工作,使該腳本不會告發不會對更新面板進行每次更新,而只會在某個事件發生後執行。這樣腳本只能在這個事件上執行。

+0

OMG你救了我! –

+0

在這個之前我嘗試了很多不同的解決方案,但都沒有工作。這個在我的用戶控制內完美無缺 –

1

ScriptManager.RegisterStartupScript需要一個參數關鍵,您所設定的控制的的UniqueID。在執行頁面腳本時,此鍵必須是唯一的。所以,你應該改變這一行:

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

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

,或者你喜歡的一些其他的方法來生成唯一鍵。