2010-01-18 68 views
9

重複代碼的任何想法,我有一個asp.net mvc的網站,我建立了頁面的大部分使用C#例如從我的視圖模型建立HTML表格給出了一組數據避免在C#和JavaScript

我也有很多JavaScript,然後動態地修改這些表(例如添加行)。

添加新行的javascript代碼看起來與我在C#中的「渲染」代碼非常相似,該代碼用於首先構建html表。

每次我將c#代碼更改爲添加新字段時,我都必須記得回到JavaScript代碼來做同樣的事情。

這裏有更好的方法嗎?

回答

8

這樣做的一種方法是將生成標記的邏輯公開爲服務器上的Web服務,並讓JavaScript通過AJAX調用獲取標記,而不是重複邏輯。

通過這種方式,您可以調用JavaScript中的CreateRow方法,該方法實際上會調用與渲染頁面時在服務器上使用的確切邏輯相同的邏輯。

+0

這是一個好主意。 。可能會比客戶端已經存在的代碼稍慢,但肯定會去除冗餘。 – leora 2010-01-18 16:33:26

0

看看斯科特谷的文章:ASP.NET MVC 2: Model Validation

基本上,你在模型屬性級別定義的驗證,以及ASP.NET MVC 2可以自動生成合適的客戶端驗證也是如此。

不幸的是,這可能意味着你不得不將所有的東西都重構成MVC,但是很多人在這裏可能會認爲這是一個優點。

(免責聲明:我沒有用ASP.NET MVC在所有的工作)

+0

我的代碼與重複驗證無關..其更多的建立HTML – leora 2010-01-18 23:57:00

0

違反公認的和流行的答案被@Andrew野兔。我寧願僅在JavaScript中實現標記生成(並重用構建HTML表格),而不是僅在C#中實現標記(當然,如果JavaScript需要該功能)。

因爲:

  1. JavaScript是比C#的HTML更好,因爲它可以修改已經呈現的DOM。所以用Javascript你可以做的不僅僅是靜態的HTML。也許你現在不需要它了,但是現在的應用程序變得更像一個富互聯網應用程序的要求並不少見。
  2. AJAX調用比處理服務器端數據並將其轉換爲現有表的新行的最差Javascript實現更可能慢。而且也比在Javascript中從頭開始錶慢。
  3. 較少的服務器請求(和更多的客戶端需求,但通常不是問題)。
  4. 有幾個非常好的Javascript框架,使真正漂亮的表(以及更多)。

我知道,ASP.NET MVC有很多關於如何爲您的控件使用HTML Helpers的好例子,從而實現了乾淨和快速的開發。但是,如果您最終創建了JavaScript函數,那麼我認爲您應該再考慮關注的分離問題,並堅持使用Javascript並放棄HTML助手中的重複項。

因爲擴展你的Javascript函數來創建整個表,如果你已經創建了行,我猜不應該那麼困難。下面是如何將數據傳遞給Javascript,然後使用Javascript中已有的函數「createRow」的想法:

<script> 
    var data = []; 
    <% foreach (var item in Model) { %> 
     data.push({ 
      Id: <%= Html.Encode(item.Id) %> 
      , Title: <%= Html.Encode(item.Title) %> 
     }); 
    <% } %> 
    createTableHeader(); 
    for (var i = 0; i < data.length; i++) { 
     createRow(data[i]); 
    } 
    createTableFooter(); 
</script>