2009-09-24 52 views
2

可以即時生成此類代碼嗎?或者這是一個主要的代碼氣味?這怎麼能變得更好?實時生成javascript的C#代碼

我是新來的網絡,但我一直在絆倒這一切,我不明白爲什麼。

// Create a js function that applies foo to each group of controls 
foreach (KeyValuePair<string, Dictionary<Control, string>> pair in maps) 
{ 
    js.Append(pair.Key); 
    js.Append("=function(grid){Prm.remove_endRequest("); 
    js.Append(pair.Key); 
    js.Append(");if(grid && grid._element)"); // ... blah blah blah 

} 
page.ClientScript.RegisterClientScriptBlock(page.GetType(), key + "Ajax", 
    js.ToString(), true); 

回答

4

我不認爲它是一種氣味,直到你開始做遍地方。

考慮到這些變化,但是,這將有助於出未來:

  1. 寫入數據驅動的JS功能,只有動態生成所需要的數據。這樣,所有的JS都可以隱藏在一個快速的靜態文件中,而你的服務器只發送數據。 這是比(2)和(3)更好的設計更改 - 它確實不那麼難。考慮一下你當前的代碼生成器需要的數據,提供這些數據而不是JS代碼,然後將你的JS代碼封裝在接受數據作爲輸入的「工廠函數」中。

  2. 正如您使用HTML模板一樣,爲JS代碼使用模板。這樣,當你真的只想改變一些變量名時,你不必在C#流控制/數據控制代碼中徘徊。我會建議用它所協助的視圖的名稱命名模板文件。如果你有Home.aspx那麼也許你會有JS代碼模板Home_DoCrazyGridThing.jsHome_DoOtherCrazyThing.js。你可以編寫一個簡單的模板引擎或使用其中的一個。

  3. 通過生成代碼創建一個薄層,以便明顯知道你在向維護者做什麼。也就是說,有一個JSCodeGenerator類,具有不同的智能級別(理解語言或只允許您在其中轉儲字符串或從(2)中與emplate引擎進行接口)。