最初にMVC.netとWebApiにv8を埋め込み、まったく同じテンプレートを維持するためにアンダースコアまたはひげ剃りを使用してテンプレートを実装しました。
テンプレートが同じ場合でも、レンダリングロジックが異なる場合があり、テンプレート、フロントエンドビュー、バックエンドビューを常にリファクタリングする必要があります。特にあなたが安らかな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/
Aを使用して新しいコンテンツを更新するには、 'RenderPartial'または' @ Html.Partial'を使用できますジャックスそうすれば、あなたはあなたのRazorテンプレートを持っているだけです。ダブルボーナス:サーバーへの別のトリップを回避するために、新しいコンテンツを更新した後に部分ビューを返します。 –
+1良い質問です。私は、クライアントサーバー間でビューを共有する良い方法を見いだせませんでした。私はできることを望み、両方を維持しなければならないリスクと仕事を導入する – reach4thelasers