2016-01-08 67 views
0

我一直在碰撞這個問題一週,所以我想我最好打電話給專家:)。在回發中加載特定的動態用戶控件

這個問題比實際的代碼問題更美觀,但我懷疑他們可能有關係。在我的程序中,我有一系列動態添加到網頁的用戶控件。這些用戶控件可以包含幾乎任何東西(在合理範圍內),我正在使用的控件現在包含一個按鈕和一個圖表(通過Javascript生成),但可能會變得更加複雜。動態控件通過「Page_Init」事件添加,並且所有渲染均呈現100%正確。我在這方面沒有問題。

當我在其中一個控件中進行回發時,會發生此問題。發生回發時,「Page_Init」事件會在回發中執行代碼之前重新生成所有動態控件。根據頁面生命週期模型,一切正常。但是,由於回發僅發生在其中一個控件中,因此我希望如果只有控制重新呈現。因爲現在所有三個控件都會重新渲染,這會讓用戶感到分心。

有沒有辦法可能攔截按鈕生成的回發,並通過AJAX在服務器處理? Telerik的「RadAjaxManager」做了類似這樣的事情,但遺憾的是這個組件並不適合我,我也不需要任何複雜的東西。我知道一個建議是使用AJAX和Webservices編寫控件,但是在我的場景中這太難了,因爲動態控件可以包含它們自己的靜態控件。

因此,在短期:

- >有相當複雜的服務器端代碼三個功能動態控制。正確運行功能。無法轉換爲純Javascript/Web服務代碼。

- >當其中一個控件執行回發時,所有三個重新呈現。讓用戶分心,尤其是涉及到彈出窗口時。

- >需要一種方法來只重新渲染正在更新的控件。

謝謝!

+0

使用UpdatePanel – Khazratbek

+0

https://msdn.microsoft.com/en-us/library/bb399001.aspx – Khazratbek

+0

感謝您的回覆。我確實有很多更新面板,但他們沒有解決問題。看起來好像我的一個Javascript延遲太長了。不完全解決問題,但有幫助。我最初的想法是像Dojo加載器那樣,網頁的一部分可以在沒有其他人刷新的情況下更新,但似乎手動編寫這樣的代碼非常困難。 – GertV

回答

1

設計頁面:

<asp:ScriptManager ID="MainScriptManager" runat="server" /> 
<div class="row text-center text-white"> 
    <h2> 
     <asp:Literal ID="litTitle" runat="server" Text="Feedbacks" /> 
    </h2> 
</div> 
<div class="row"> 
    <div> 
     <asp:UpdatePanel ID="updFeedbacks" runat="server"> 
      <ContentTemplate> 
       <asp:Repeater ID="rptFeedbacks" runat="server"> 
        <ItemTemplate> 
         <div class="myFeedback"> 
          <span><%#Eval("username") %></span> 
          <div class="text-white"> 
           <%#Eval("feedback") %> 
          </div> 
         </div> 
        </ItemTemplate> 
        <SeparatorTemplate> 
         <hr /> 
        </SeparatorTemplate> 
       </asp:Repeater> 
       <br /> 
       <div class="text-center"> 
        <asp:Button ID="btnShowMore" runat="server" CssClass="trasparentButton" Font-Size="11" Text="Show more feedbacks" OnClick="btnShowMore_Click" /> 
       </div> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </div> 
</div> 

後面的代碼:

private static int FeedbacksNumber = 10; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     BindRepeater(FeedbacksNumber); 
} 

protected void BindRepeater(int rows) 
{ 
    SqlConnection con = new SqlConnection(Utils.Connection); 
    SqlCommand cmd = new SqlCommand("select columns from table where rowsnumber < @num", con); 
    cmd.Parameters.Add("@num", SqlDbType.Int).Value = rows; 
    con.Open(); 
    SqlDataAdapter sda = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    sda.Fill(ds); 
    rptFeedbacks.DataSource = ds; 
    rptFeedbacks.DataBind(); 
    con.Close(); 
} 

protected void btnShowMore_Click(object sender, EventArgs e) 
{ 
    FeedbacksNumber += 10; 
    BindRepeater(FeedbacksNumber); 
} 

這裏當你點擊顯示按鈕,10多個反饋被裝載更多的反饋。它不會發送回傳。它會像JavaScript一樣更新中繼器,無需回傳並移動光標或其他內容。

+0

謝謝,這有助於很多。我唯一剩下的問題是Javascript在對象重新創建時執行。由於Javascript在對象重新創建後執行,所以更改不會存儲在視圖狀態中,並且必須在頁面加載後重新創建,這可能會讓視覺更加分散注意力,例如重新生成Highcharts圖表。不過,我認爲這是由於一些內部計時器造成的。 – GertV

+0

@GertV您可以添加執行的JavaScript函數到您* ShowMore_Click *方法: – Khazratbek

+0

@GertV我舉一個簡單的例子 – Khazratbek