2011-11-17 48 views
9

我正在建立一个ASP.NET MVC中的应用程序,并考虑backbone.js客户端交互等。我如何在我的ASP.NET MVC后端和我的backbone.js前端之间共享模板?

理想情况下,当页面加载时,我想要预先呈现所有现有的内容服务器端以及由backbone.js动态呈现的任何新内容。

当然,我真的不想两次写我的模板。

我在考虑让大部分应用程序使用剃刀视图引擎模板化,然后使用小胡子模板来处理需要在服务器和前端之间共享的小区域。

我的问题是,这个样子的实际技术实现是什么样的?

你能提供你如何实现这一目标的代码示例吗?

例如,您将使用哪个库在服务器上呈现模板,然后手动从模板文件中提取文本并将其注入到JavaScript中?

+1

您可以使用'RenderPartial'或'@ Html.Partial'来刷新您的新内容,使用A JAX。这样你只需要有你的Razor模板。双重奖励:更新新内容后返回部分视图,以避免再次访问服务器。 –

+0

+1好问题。我还没有找到在客户端服务器之间共享视图的好方法。我希望我能,它介绍了风险和工作必须保持两个 – reach4thelasers

回答

1

我评估Razor Client Templates (GitHub)。它在版本0.7.0中,目前似乎有点脆弱。

它允许您引用单个部分剃刀视图作为JavaScript模板。

作为商业产品的一部分,我们将进一步从我们的剃刀分支中输出Handlebars.js兼容模板。

+2

我正在寻找同样的事情。你有没有得到你的版本的任何地方? – Nathan

0

你有没有考虑jQuery模板,在我们使用它们的项目上,我发现它们非常有用。我们实际上使用了这一个http://github.com/BorisMoore/jsviews,这是jQuery模板渲染为字符串的一个优化版本。 你有很多的演示。 在服务器端,我们将所有模板放在一个局部视图中并进行渲染。

1

如果你想要一个RESTy MVC应用程序,我推荐ServiceStack。 您可以查看源代码中的骨干网络服务包todo-app

我做了类似的东西(不使用小胡子),其中控制器将模型输出为json以供骨干使用。

0

首先,我们选择在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/

相关问题