這可能嗎?對於我想達到的一個例子,請使用Facebook評論系統。現有的評論在服務器上呈現,但如果我留下新的評論,它是使用客戶端上的AJAX創建的。理想情況下,我想只在一個地方存儲評論模板,並在服務器(由Razor呈現)和客戶端(使用由服務器返回的JSON呈現的Javascript)上訪問它。用於客戶端和服務器的ASP.NET MVC模板
任何想法?
編輯:我想另一個選擇是堅持純粹的服務器端渲染,而當用戶發佈新的評論,返回呈現的HTML瀏覽器被塞到DOM。這不太好,但我很想知道這是否可能。
這可能嗎?對於我想達到的一個例子,請使用Facebook評論系統。現有的評論在服務器上呈現,但如果我留下新的評論,它是使用客戶端上的AJAX創建的。理想情況下,我想只在一個地方存儲評論模板,並在服務器(由Razor呈現)和客戶端(使用由服務器返回的JSON呈現的Javascript)上訪問它。用於客戶端和服務器的ASP.NET MVC模板
任何想法?
編輯:我想另一個選擇是堅持純粹的服務器端渲染,而當用戶發佈新的評論,返回呈現的HTML瀏覽器被塞到DOM。這不太好,但我很想知道這是否可能。
我反對渲染服務器端,然後將它發回給JS腳本以獲得帶寬和性能。而應該使用可在服務器和客戶端上運行的模板引擎。當客戶想要刷新評論時,它僅請求評論的數據,然後用使用服務器上使用的相同模板從數據呈現的新HTML替換舊評論html。
我一直在使用小鬍子模板引擎來實現這個使用PHP和JS。有一個.NET版本,我猜想ASP.NET的作品,我猜你正在使用ASP.NET。
所以我所做的是確保我在PHP和JS中以相同方式格式化數據,然後使用Mustache模板進行渲染。
鬍子是簡單易用。你拿一個對象和一個模板,然後你回到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)
我使用是有使用通配符和/或類名隱藏的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功能,將其添加到列表中,或刷新整個評論列表。這不是一個完整的示例,但希望你明白。
我也在考慮這種方法,但主要缺點是(i)現有內容不適用於搜索引擎,並且(ii)頁面現在不會優雅地退化,因爲沒有CSS告訴瀏覽器顯示:沒有模板對用戶可見。你怎麼看? – 2011-05-31 13:04:39
沒錯,它有缺點,但是,(i)我爲搜索引擎蜘蛛創建了動態站點地圖,最近蜘蛛越來越聰明地關於ajax加載的內容。 (ii)對不起,模板應該有style =「display:none;」。您可以創建助手(和剃刀回調)來構建這些代碼塊。 – 2011-05-31 14:47:24
我還沒有剃刀或ASP.NET MVC的工作很多,但辦法我通常使用單軌和NVelocity來接近它:
有一個頁面模板。 對於評論,請在您的主模板中包含部分模板。 對於AJAX請求,請使用該部分模板呈現註釋部分的標記。用你喜歡的方法替換它的客戶端。
這種方式,會讓你有標記的一個地方,不管,如果它是一個普通的請求或Ajax請求。
我找不到鬍鬚的.NET版本。主頁提到除了其他語言! – 2011-05-31 13:07:13
它在那裏! [.NET](https://github.com/jdiamond/Nustache) – Vilhelm 2011-05-31 16:43:53
是的,我正在失明,謝謝。 – 2011-06-01 12:08:56