2011-05-12 50 views
1

在我的職業生涯中,我多次遇到這個問題,從來沒有找到一個優雅的解決方案。想象一下,你有一個簡單的頁面,有一箇中繼器。您通過數據綁定在服務器端填充該中繼器。這太棒了,快速工作,並做它應該的。但是現在你想添加分頁器到該中繼器,否則改變輸出。通過Ajax實現是實現富客戶端交互的首選方式。在ASP.NET中使用JavaScript模板

因此,您創建一個Web服務,以JSON的形式爲您提供數據,但是現在您被卡住了......要麼您必須編寫複雜的客戶端代碼來查找每個需要在每個中繼器中修改的字段 - 項目,或者你必須吹走中繼器的整個服務器端輸出,並從頭開始構建新的HTML,或者我最近使用的方法,首先重複項目,吹走其他所有內容並克隆第一項儘可能多的時間,你需要和修改它的領域。所有描述的方法都不是最優的,因爲不管它們是什麼,它們都需要服務器端(即中繼器中的模板)和客戶端(用於顯示JSON數據的JavaScript)上的重複邏輯, 。有一個更好,更簡單的方法來做到這一點。首先想到的是,不是從Web服務器返回JSON,而是返回預填充中繼器的HTML。但對於這樣的事情,我不妨使用ASP.NET AJAX更新面板。單獨的Web服務的輸出不會更小。

接下來我想到的是JavaScript模板。如果有什麼方法可以在服務器端採用未經處理的中繼器模板,並將其轉換爲JavaScript模板,該模板可以在加載時嵌入在頁面中,也可以作爲Web服務響應的一部分。但是,我找不到任何現有的解決方案。我想不出一個簡單的方法來做到這一點。有任何想法嗎?

P.S.在頁面加載時將JavaScript模板呈現給客戶端,並且使用JavaScript來填充它,而不在服務器上呈現初始視圖(沒有中繼器和數據綁定)是不可能的。我太在乎表演。

+1

如果您將模板卸載到客戶端,您的性能會如何變差?這實際上將是最好的解決方案。 – Tejs 2011-05-12 03:19:20

+0

沒有。如果您在服務器上禁止初始頁面加載,則會返回純HTML。如果您返回JavaScript模板和JSON(作爲頁面的一部分,或者作爲AJAX請求禁止上帝),則不僅需要提供純HTML,還必須在頁面完成加載後使用JavaScript處理它。頁面的初始加載應始終在服務器上完全呈現,因爲它是受控制的環境。 – 2011-05-12 03:27:04

+1

許多像gmail一樣被販賣的網站會不同意。 – Tejs 2011-05-12 03:30:11

回答

0

在考慮了不同方法的所有優點和缺點後,我停止了以下方法。我創建了一個可以呈現HTML的自定義ASP.NET數據綁定控件,但是,當頁面被查詢字符串參數請求時,而不是僅僅進行標準渲染時,它將使用Response.Clear()和Response。End()和這兩個命令之間根據查詢字符串參數輸出JSON版本的數據。同樣,在頁面的第一次渲染中,它還將使用反射來輸出JavaScript模板,以從控件的模板區域讀取變量的名稱。

這種方法效果很好,我所要做的就是將我的控件放在頁面上,將數據綁定到它,並且它作爲支持分頁,排序和過濾的真正AJAX網格工作。但它確實有限制。在控件的模板中,您只能指定變量而不是表達式。否則反射無法將其轉換爲JavaScript變量。但我可以忍受這一點。

我考慮的其他可能性是一個單獨的Web服務,它將頁面的一種類型作爲參數,並使用反射來獲取數據綁定對象以及爲網格創建模板。我也關於寫我自己版本的更新面板,這不會使用視圖狀態,只發送在頁面的一部分。

1

首先,我不認爲使用客戶端模板,甚至在第一次加載JSON數據將產生不利影響,除非我們如手機等談論與不同外形的設備

但是,如果必須使用服務器端模板/渲染,那麼爲什麼不讓服務器返回中繼器的HTML。這可以通過將中繼器邏輯放入不同的用戶控制/頁面並僅處理ajax請求中的頁面來完成。這完全不等同於使用UpdatePanel(如您所陳述的那樣) - UpdatePanel發佈具有更多請求大小的整個頁面數據(包括視圖狀態)。響應大小也很大,因爲它必須包含視圖狀態。在服務器端,使用UpdatePanel也會導致加載包含狀態數據和事件後處理的完整控制樹。只發送必要的html是更好的方法,並且完全適合您的需求 - 唯一的問題是與JSON相比,html的大小會更大。

最後,還有一些有趣的項目,如Script# - Script#將C#代碼轉換爲java-script。您可以構建類似的東西(使用腳本#本身)將服務器端模板代碼轉換爲eqivalent JS代碼。在類似的路線上更可行的方法可以是使用T4模板將技術無關的模板轉換爲服務器端代碼(標記+代碼或純代碼)和等效的JS代碼。

+0

如果我們正在談論我給出的一個例子 - 確實如此,績效不會受到太大影響。但是一個真實的例子,一個包含多個數據綁定區域的大頁面,或者一個非常大的,多變量的數據綁定區域,它可能會很明顯。同意UpdatePanels,我只是關閉了我的頁面的視圖狀態很長一段時間,我忘了它:-)好主意#腳本。我會看看,T4模板理論上聽起來不錯,但在實踐中,我認爲它會更麻煩,那麼它是值得的。 – 2011-05-12 15:03:59

+0

@Ilya,我已經指出了Script#的概念視角。國際海事組織,這將需要更多的努力,用於這種具體需求或建立類似的東西。我仍然相信使用T4等自定義模板引擎是可行的,並且提供更多的靈活性。 – VinayC 2011-05-13 04:07:27