2009-08-12 107 views
1

我的問題是關於從客戶端動態生成的HTML/JavaScript調用服務器端事件(例如DeleteClicked)。我在我的網站上有一個現有的網頁,它深深植根於.net。頁面生命週期非常複雜,可以從頁面中觸發幾十個事件。動態添加客戶端腳本/ HTML調用服務器端事件

我們希望開始利用一些JQuery功能,並在頁面已經加載後添加額外的鏈接和按鈕。例如,我們希望在某些圖像上顯示一些懸停圖形。小圖標可以提供刪除,編輯等功能。我希望將這些客戶端創建的點擊事件綁定到服務器端事件,而不必顛覆(或繞過)整個頁面生命週期。

到目前爲止,我能想到的唯一解決方案是在整個頁面中植入隱藏的asp.net控件,並在客戶端代碼中手動強制隱藏控件上的click()。不幸的是,我不認爲這是可以接受的,因爲我不一定知道載入頁面時可能需要調用的所有事件。我也不喜歡向客戶發送大量不需要的標記。

我的問題有意義嗎?任何幫助將不勝感激!

回答

0

我正在對那些被打開的舊問題做一些清理工作,這裏最好的解決方案是ASP.NET MVC--這種事情的更好的框架!對於那些被迫使用Web窗體的人,我很抱歉我沒有更好的解決方案。對於那些有嘗試新事物的人,我強烈建議MVC!

0

如果你走的是隱藏的控制路線,並且你不知道可能需要在特定負載上調用的所有事件,那麼你將不得不加載所有可能需要的隱藏按鈕。通過這種方式,您始終可以確保擁有一個可以觸發的控件,並將其發送回服務器。

您也可以只用一個'click'控制器來檢查參數,看看它的執行情況,但這非常笨拙。

或者,您可以從您的服務器端代碼暴露Web方法,它可以從您的JavaScript異步調用。通過這種方式,您可以執行操作而無需控件上的事件處理程序。

例如:

/// <summary> 
    /// Deletes the 'something'. 
    /// </summary> 
    /// <param name="id">The unique id of the 'something' to delete.</param> 
    [WebMethod(true)] 
    public void DeleteSomething(string id) { 
     //Insert business logic 
    } 

看看到的WebMethods(或AJAX如其他人所說的),我想你會發現它適合您的解決方案。

+0

使用WebMethods的問題是它可能會改變我的頁面綁定到的基礎數據。如果我然後從asp.net控件中觸發事件(在其他AJAX調用並命中WebMethod之後),則此事件可能無效,因爲控件可能不再存在。我需要一種方式讓我的動態html/javascript使用常規頁面生命週期。 WebMethods是「真正的AJAX」並繞過了頁面生命週期。 – jakejgordon 2009-08-12 13:05:07

+0

如果您將'onsuccess'javascript處理程序掛接到您的web方法調用,則可以在事件通過web方法成功完成後使用javascript/jquery更新控件。你也可以掛鉤失敗的JavaScript處理程序,這樣如果調用失敗,你可以執行任何需要的清理。 – 2009-08-12 13:44:00

+0

這可能會變得更加溫暖......我能看到的唯一明顯的問題是,我們基本上必須對服務器執行2個請求來處理這些操作之一 - 一個執行WebMethod操作,onsuccess我們基本上必須重新加載頁面(或適當的更新面板)。 – jakejgordon 2009-08-12 14:52:31

1

如果你真的想擁抱這個,你應該用稍微不同的方式來看待它。

  1. 所有執行該 「刪除」的邏輯應該是一類 可重複使用
  2. 你的ASPX頁面可以 然後調用這個類來執行 刪除的地方,現在出現
  3. 您的jQuery可以使用AJAX請求調用Web服務 ,並且web服務可以引用與您的ASPX頁面相同的類 。

您不僅通過這種方式獲得代碼重用,還意味着您可以在不使用UI的情況下測試代碼。

+0

我有刪除邏輯分解出來,也知道如何使用WebMethods - 但我不認爲這將解決我的問題。這是我對另一個答案的評論的副本:使用WebMethods的問題是它可能會更改我的頁面綁定到的基礎數據。如果我然後從一個ASP發起一個事件。網絡控制(在其他AJAX調用並命中WebMethod之後),事件可能無效,因爲控件可能不再存在。我需要一種方式讓我的動態html/javascript使用常規頁面生命週期。 WebMethods是「真正的AJAX」並繞過了頁面生命週期。 – jakejgordon 2009-08-12 13:06:56

1

雖然jQuery將是更輕量級(和更性感)的解決方案,你有沒有想過在頁面上拍幾塊UpdatePanels?這並不理想,但在沒有太多額外編碼的情況下,將Ajax功能添加到現有表單中是一種相對無痛的方式。

如果你對jQuery感興趣,你可以選擇WebMethod route,它將所有的功能都保存在一個頁面中,甚至可以創建新的.aspx頁面,jQuery將調用它來執行某些操作(例如,如果你有一個包含聯繫人的邊欄,這可以移動到一個新的Ajax/Contacts.aspx頁面,然後您可以通過jQuery調用進行編輯)。

+0

我很確定我們添加的功能對於更新面板來說太性感了。我們確實已經在頁面上有幾個UpdatePanel,但問題仍然存在。查看我添加到其他答案的其他評論。感謝您的幫助。 – jakejgordon 2009-08-12 13:09:17

0

不幸的是,我們沒有找到一個很好的解決方案。這似乎是有效地混合.net事件和JQuery AJAX的唯一方法,就是如果你正在更新的元素是100%JQuery或100%.net事件。例如,如果您要動態地添加某種類型的對象(如帶有一組鏈接的圖片)(例如編輯和刪除),那麼鏈接應該都使用手動AJAX(即調用WebMethod的JQuery),然後使用JQuery更新DOM; 這兩個鏈接都應該在更新面板中調用.net事件。如果你試圖製作一個鏈接JQuery,而另一個鏈接是一個.net事件,那麼你會得到一些問題.net不知道DOM已經被JQuery更新,你的事件可能會被搞砸。預測在DOM中設置哪些適當的ID是非常困難的,這樣.NET就不會感到困惑(如果您使用的是JQuery)。當.NET 4.0發佈時,它會變得更容易,因爲您可以選擇手動指定控件ID而不是.NET,從而生成它自己的瘋狂ID。

0

怎麼樣在經典<%= 控制 .ClientId%>服務器端標記到JS?這有點麻煩,但也許是一個選項,讓你可以一直使用.NET 4.0。

相關問題