2011-05-31 92 views
8

這可能嗎?對於我想達到的一個例子,請使用Facebook評論系統。現有的評論在服務器上呈現,但如果我留下新的評論,它是使用客戶端上的AJAX創建的。理想情況下,我想只在一個地方存儲評論模板,並在服務器(由Razor呈現)和客戶端(使用由服務器返回的JSON呈現的Javascript)上訪問它。用於客戶端和服務器的ASP.NET MVC模板

任何想法?

編輯:我想另一個選擇是堅持純粹的服務器端渲染,而當用戶發佈新的評論,返回呈現的HTML瀏覽器被塞到DOM。這不太好,但我很想知道這是否可能。

回答

8

我反對渲染服務器端,然後將它發回給JS腳本以獲得帶寬和性能。而應該使用可在服務器和客戶端上運行的模板引擎。當客戶想要刷新評論時,它僅請求評論的數據,然後用使用服務器上使用的相同模板從數據呈現的新HTML替換舊評論html。

我一直在使用小鬍子模板引擎來實現這個使用PHP和JS。有一個.NET版本,我猜想ASP.NET的作品,我猜你正在使用ASP.NET。

所以我所做的是確保我在PHP和JS中以相同方式格式化數據,然後使用Mustache模板進行渲染。

http://mustache.github.com/

鬍子是簡單易用。你拿一個對象和一個模板,然後你回到HTML。

例子中的物體:

object->user = "Kilroy" 
object->comment = "was here" 
object->edited = true 

示例模板:

{{user}} {{comment}} {{#edited}}(This comment has been edited){{//edited}} 

結果:

Kilroy was here (This commment has been edited) 
+0

我找不到鬍鬚的.NET版本。主頁提到除了其他語言! – 2011-05-31 13:07:13

+1

它在那裏! [.NET](https://github.com/jdiamond/Nustache) – Vilhelm 2011-05-31 16:43:53

+0

是的,我正在失明,謝謝。 – 2011-06-01 12:08:56

2

我使用是有使用通配符和/或類名隱藏的HTML模板的方法,然後在文件準備通過AJAX/JSON調用加載的內容,並最終刷新或使用JavaScript中的同一模板添加新項目。

<ul id="template"> 
    <li> 
    <span class="message"></span> 
    <span class="date"></span> 
    </li> 
</ul> 

<ul id="comments"></ul> 

<script type="text/javascript"> 
    $().ready(function() { 
     loadComments(); 
    }); 
    function loadComments() { 
     $.post('@Url.Action("GetComments", "Forum")', {}, function(comments) { 
      for (i = 0; i < comments.length; i++){ 
       loadComment(comments[i]); 
      } 
     }, 'json'); 
    } 
    function loadComment(comment) { 
     var template = $('#template li').clone(); 
     template.find('.message').text(comment.message); 
     template.find('.date').text(comment.date); 
     $('#comments').append(template); 
    } 
</script> 

新郵件,你可以發佈信息到服務器,然後使用loadComment功能,將其添加到列表中,或刷新整個評論列表。這不是一個完整的示例,但希望你明白。

+0

我也在考慮這種方法,但主要缺點是(i)現有內容不適用於搜索引擎,並且(ii)頁面現在不會優雅地退化,因爲沒有CSS告訴瀏覽器顯示:沒有模板對用戶可見。你怎麼看? – 2011-05-31 13:04:39

+1

沒錯,它有缺點,但是,(i)我爲搜索引擎蜘蛛創建了動態站點地圖,最近蜘蛛越來越聰明地關於ajax加載的內容。 (ii)對不起,模板應該有style =「display:none;」。您可以創建助手(和剃刀回調)來構建這些代碼塊。 – 2011-05-31 14:47:24

0

我還沒有剃刀或ASP.NET MVC的工作很多,但辦法我通常使用單軌和NVelocity來接近它:

有一個頁面模板。 對於評論,請在您的主模板中包含部分模板。 對於AJAX請求,請使用該部分模板呈現註釋部分的標記。用你喜歡的方法替換它的客戶端。

這種方式,會讓你有標記的一個地方,不管,如果它是一個普通的請求或Ajax請求。

相關問題