2011-06-07 329 views
6

我在C#2.0中使用ASP.NET。我爲數據庫創建了一些對象,並且這些對象中的每一個都具有可以本地調用的屬性或者以類似方式調用的屬性,並從它們創建一個JSON API。服務器端和客戶端方法

我有很多標籤式的東西,我喜歡在這個網站上調用'模塊' - 模塊的功能是將數據轉換爲HTML以顯示在頁面上。理想情況下,這需要在服務器端C#代碼中加載第一個選項卡,然後在單擊選項卡時使用Ajax加載其他選項,但對於舊的瀏覽器和搜索引擎,選項卡仍然是一個鏈接,將加載相同的HTML代碼服務器端。

目前我寫的JavaScript代碼完全獨立於將每個模塊轉換爲HTML的C#代碼,但方法實際上是相同的,只是一種不同的語言。類似於這個例子。

C#代碼

public override string GetHtml() 
{ 
    IJsonObjectCollection<Person> response = ((Village)page).People; 
    string html = "<div id=\"test\">"; 
    foreach (Person person in response) 
    { 
     html += "<div class=\"person\">"; 
     html += person.Name; 
     if(canEdit) html += "*"; 
     html += "</div>"; 
    } 
    return html + "</div>"; 
} 

JavaScript代碼

function getHtml() { 
    JsonRequest('/json/villages/1/people', function(response) { 
     var html = '<div id="test">'; 
     for (int i = 0; i < response.length; i++) 
     { 
      var person = response[i]; 
      html += '<div class="person">'; 
      html += person.name; 
      if(canEdit) html += '*'; 
      html += '</div>'; 
     } 
     return html + '</div>'; 
    }); 
} 

你或許可以看到我這個問題去。什麼是最有效的方法呢?我正在考慮一些不同的選擇 -

1.每個ModuleToHtmlMethod可能是一個類,它定義將此數據對象轉換爲HTML的方法。我試過這個,但因爲太複雜,我停下了。

2.寫我自己的腳本語言,可以解釋爲C#,但也編譯成JavaScript代碼。

只要寫在C#中的很多,使用Ajax簡單地請求從C#

4. HTML內容保持分離的代碼,寫的每一個方法的兩倍。

我想最終讓其他開發人員編寫這些'模塊',所以也許選項是最好的選擇?

回答

1

我會放棄選項4,因爲它會使維護變得更加困難,並且最終可能會導致通過Javascript生成的HTML和C#代碼生成的HTML之間不同步。我也會放棄選項2,因爲這可能會使代碼對其他開發人員更加困難,也可能不必要。

我肯定會在一個地方生成HTML,可能會公開使用C#存在函數返回HTML片段的RESTful HTML API。所以從你的Javascript你可以打電話:

function getHtml() { 
    MyHtmlRequest('/html/villages/1/people', function(response) { 
     var html = response.Text; 
     return html; 
    }); 
} 
+0

我想,這可能是最好的一段路要走。這裏的問題是大部分代碼都是循環的(可能很大),所以大部分的html都會重複使用,這會大大增加響應的大小。 gzip壓縮會幫助我嗎? – Connell 2011-06-07 09:46:07

+0

使用gzip你應該減少50-70%的響應大小,這是你的電話,看看這是否可以接受。您應該使用JSON RESTful API和HTML RESTful API來計算相同響應之間的字節差異。如果差異小於50%,gzip肯定會解決標記開銷。 – 2011-06-07 14:11:31

+0

我不需要測試它來告訴你它需要額外超過50%。有些循環通常循環10-20次,但可能會延長到50個循環,具體取決於所調用的數據類型。然後,html代碼類似於「

'+row.name+' Edit
」或類似的代碼。通常更多的HTML,也許是一個刪除按鈕。 – Connell 2011-06-08 08:21:49

1

一些建議。

  • 有一個反映html的泛型GetHtml方法。這可能很難,因爲用戶界面不是簡單而統一地映射到數據字段的東西。
  • 有你的「模塊」元描述,用它來創建通用GetHtml方法
  • 最後try this:它將使你剛剛創建的JavaScript方法,那麼你就可以從C#

打電話給他們我會去第二個元描述選項,因爲這是我爲我的數據層做的。我基本上有一個文件定義我的領域模型。我使用它來生成所有數據acccess pocos,nhibernate配置文件等。然後我有一個元數據文件,它將信息添加到這些對象中,如UI渲染信息和字段驗證信息。

TNX

圭多

+0

在第二個選項中,你的意思是一個人類可讀的描述,它允許用多種語言編寫完全相同的函數,或者可以用類似於我的第二個選項的機器可讀描述? – Connell 2011-06-08 08:15:32

+0

我的意思是一個代碼生成器。所以你定義一個'描述文件',然後生成你所有的getHtml方法。所以基本上,最後發生的是你在DSL中描述你所有的模塊(xml或json很好,你可能想看看[T4](http://msdn.microsoft.com/en-us/library/bb126445)。 ASPX))。所以是的,它就像你的選擇2,但它比編寫你自己的腳本語言簡單得多。 – gatapia 2011-06-09 00:08:19

+0

嗯..我可以看到這是如何與JavaScript的作品。一旦它生成C#代碼,我是否簡單地將代碼複製到C#代碼中?或者我會用一些奇特的方式來解釋這個定義,或者編譯它? – Connell 2011-06-10 08:18:08