首先,我们选择在MVC.net和WebApi中嵌入v8,并使用下划线或小胡子来实现完全相同的模板。
即使您具有相同的模板,渲染逻辑也可能不同,并且需要不断重构模板,前端视图和后端视图。特别是如果你正在做一个restfull api。
我们最终选择了另一种解决方案,使用无头浏览器(PhantomJs)为页面提供无障碍和seo需求的非JavaScript替代方案。
这很容易实现,您需要在您的服务器上安装PhantomJs,添加一个JavaScript来完全呈现包含所有javascript交互的页面并提供html输出。
你可以发现使用的例子在这里:http://backbonetutorials.com/seo-for-single-page-apps/
的例子是针对Node.js的,但它很容易与ASP
我们使用的幻像脚本类似于实现:
//phantom-server.js
var page = require('webpage').create();
var system = require('system');
var lastReceived = new Date().getTime();
var requestCount = 0;
var responseCount = 0;
var requestIds = [];
var startTime = new Date().getTime();
page.onResourceReceived = function (response) {
if(requestIds.indexOf(response.id) !== -1) {
lastReceived = new Date().getTime();
responseCount++;
requestIds[requestIds.indexOf(response.id)] = null;
}
};
page.onResourceRequested = function (request) {
if(requestIds.indexOf(request.id) === -1) {
requestIds.push(request.id);
requestCount++;
}
};
// Open the page
page.open(system.args[1], function() {});
var checkComplete = function() {
// We don't allow it to take longer than 5 seconds but
// don't return until all requests are finished
if((new Date().getTime() - lastReceived > 300 && requestCount === responseCount) || new Date().getTime() - startTime > 5000) {
clearInterval(checkCompleteInterval);
console.log(page.content);
phantom.exit();
}
}
// Let us check to see if the page is finished rendering
var checkCompleteInterval = setInterval(checkComplete, 1);
也有服务为您提供相同的结果:http://prerender.io/
您可以使用'RenderPartial'或'@ Html.Partial'来刷新您的新内容,使用A JAX。这样你只需要有你的Razor模板。双重奖励:更新新内容后返回部分视图,以避免再次访问服务器。 –
+1好问题。我还没有找到在客户端服务器之间共享视图的好方法。我希望我能,它介绍了风险和工作必须保持两个 – reach4thelasers