我開始寫什麼可能會成長爲一個大型的商業網站。該業務有幾個方面,所以我正在考慮一個基於'widget'的UI,與BBC主頁(http://www.bbc.co.uk)沒有什麼不同。客戶端部分頁面呈現和搜索引擎
我正在寫一個內容管理系統,允許管理員使用預先定義的小部件(即文本小部件,產品小部件,新聞標題小部件等)的選擇組成頁面。我正在使用ASP.NET MVC編寫應用程序。
每個控件類型的標記將封裝在用戶控件(ascx)中。我正在考慮兩種方式呈現小部件(我可以混合):
使用的RenderPartial打造的頁面在服務器上(很像從ASP.NET MVC網站科納樣品)
在提供的頁面上呈現窗口小部件佔位符,然後讓客戶端爲每個佔位符發出請求(使用jquery調用返回HTML的標準MVC操作)。
第二種方法是有吸引力的原因有兩個:
它允許一個頁面,而無需等待緩慢渲染的控件返回(如評論插件,也許) 。
它允許我在控件級別(而不是頁面級別)控制緩存。我可以使用內置的OutputCache屬性來單獨控制每種控件類型的緩存類型。
這裏的問題:
如果某些頁面的內容僅由JavaScript發起HTTP GET請求呈現(即不包括在初始響應),將這個內容是包含在Google的頁面評估/索引中?
假設JavaScript的請求上的document.ready
對於那些誰喜歡代碼觸發時,我的原型實現使用此代碼在服務器的第二種方法:
[OutputCache(Duration = 30, VaryByParam = "widgetUniqueKey")]
public ActionResult RenderWidget(int widgetId)
{
var cmsService = new CmsService();
var widget = cmsService.GetWidget(widgetId);
string viewName = widget.Accept(new ViewNameWidgetVisitor());
object viewData = widget.Accept(new ViewDataWidgetVisitor());
return View(viewName, viewData);
}
與此代碼在客戶端(初始頁面GET已返回佔位符div)
$('.widgetPlaceholder').each(function() { renderWidget(this) });
function renderWidget(source) {
var placeholder = $(source);
var widgetId = placeholder.attr('id').replace("widget", "");
var widgetUniqueKey = placeholder.children('div.uniqueId').text();
$.get('/home/RenderWidget', {
widgetId: widgetId,
widgetUniqueKey: widgetUniqueKey
},
function(data) {
placeholder.replaceWith(data);
}, "html"
);
}
widgetUniqueKey將根據窗口小部件類型的不同而不同:它可能是產品窗口小部件的產品ID;推薦小部件的用戶標識;等
非常感謝
謝謝,這是非常有用的知道。 – sandy 2010-02-22 10:33:09