次の方法で共有


Hot Towel テンプレート

作成者: Mads Kristensen

ホット タオル MVC テンプレートは John Papa 氏によって記述されています

ダウンロードするバージョンを次から選択します。

ホット タオル MVC テンプレート (Visual Studio 2012 用)

ホット タオル MVC テンプレート (Visual Studio 2013 用)

ホット タオル : これなしで SPA に取り組むのはお勧めしません。

SPA を構築したいけれど、どこから始めれば良いかわからないと思っていませんか? ホット タオルを使用すれば、SPA とそこでの構築に必要なすべてのツールがすぐに手に入ります。

ホット タオルは、ASP.NET でシングル ページ アプリケーション (SPA) を構築するための優れた開始点を生み出します。 コード、ビュー ナビゲーション、データ バインディング、豊富なデータ管理、シンプルながらエレガントなスタイル設定のためのモジュール構造が用意されていて、すぐに利用できます。 ホットタオルが、SPA を構築するために必要なすべてのものを提供するため、配管ではなく、開発するアプリに集中できます。

SPA の構築の詳細については、John Papa 氏の動画、チュートリアル、Pluralsight コースを参照してください。

アプリケーション構造

ホット タオル SPA は、アプリケーションを定義する JavaScript ファイルと HTML ファイルが含まれるアプリ フォルダーを提供します。

アプリ フォルダー内には次のものが含まれます:

  • Durandal
  • services
  • ビューモデル
  • ビュー

アプリ フォルダーには、モジュールのコレクションが含まれています。 これらのモジュールは機能をカプセル化し、他のモジュールへの依存関係を宣言します。 views フォルダーにはアプリケーションの HTML が含まれ、viewmodels フォルダーにはビューのプレゼンテーション ロジック (一般的な MVVM パターン) が含まれます。 services フォルダーは、HTTP データの取得やローカル ストレージの操作など、アプリケーションで必要になる可能性がある一般的なサービスを格納するのに最適です。 複数のビューモデルでサービス モジュールのコードを再利用するのが一般的です。

ASP.NET MVC サーバー側のアプリケーション構造

ホット タオルでは、使い慣れた、強力な ASP.NET MVC 構造に基づいて構築を行います。

  • App_Start
  • Content
  • コントローラー
  • モデル
  • スクリプト
  • ビュー
  • ASP.NET MVC
  • ASP.NET Web API
  • ASP.NET Web 最適化 - バンドルと縮小
  • Breeze.js - 豊富なデータ管理
  • Durandal.js - ナビゲーションとビューの構成
  • Knockout.js - データ バインディング
  • Require.js - AMD によるモジュール化と最適化
  • Toastr.js - ポップアップ メッセージ
  • Twitter Bootstrap - 堅牢な CSS スタイル設定

Visual Studio 2012 のホット タオル SPA テンプレートを使用したインストール

ホット タオルは、Visual Studio 2012 のテンプレートとしてインストールすることができます。 File | New Project をクリックして、ASP.NET MVC 4 Web Application を選択するだけです。 それから、[Hot Towel Single Page Application] テンプレートを選択して実行します。

NuGet パッケージを使用したインストール

ホット タオルは、既存の空の ASP.NET MVC プロジェクトを拡張する NuGet パッケージでもあります。 Nuget を使用してインストールするだけで、実行できます。

Install-Package HotTowel

ホット タオルでの構築方法

ただ、コードの追加を開始するだけです。

  1. 独自のサーバー側コード (Entity Framework と WebAPI がお勧め) を追加します (特に Breeze.js の使用が適しています)
  2. App/views フォルダーにビューを追加します
  3. App/viewmodels フォルダーにビューモデルを追加します
  4. 新しいビューに HTML と Knockout のデータ バインディングを追加します
  5. shell.js でナビゲーション ルートを更新します

HTML/JavaScript のチュートリアル

Views/HotTowel/index.cshtml

index.cshtml は、MVC アプリケーションの出発点となるルートとビューです。 これには、必要なすべての標準的なメタ タグ、css リンク、JavaScript 参照が含まれています。 本文には、要求されたときにすべてのコンテンツ (ビュー) が配置される場所である 1 つの <div> が含まれています。 @Scripts.Render では、Require.js を使用してアプリケーションのコードの開始ポイント (main.js ファイルに含まれる) が実行されます。 splash screen は、アプリが読み込まれている間のスプラッシュ スクリーンを作成する方法を示すために用意されています。

<body>
    <div id="applicationHost">
        @Html.Partial("_splash")
    </div>

    @Scripts.Render("~/scripts/vendor")
        <script type="text/javascript" src="~/App/durandal/amd/require.js" 
            data-main="@Url.Content("~/App/main")"></script>
</body>

App/main.js

main.js ファイルには、アプリが読み込まれるとすぐに実行されるコードが含まれています。 ここは、ナビゲーション ルートを定義し、起動ビューを設定し、アプリケーションのデータの準備などのセットアップ/ブートストラップを実行する場所です。

main.js ファイルでは、アプリケーションの起動に役立つ Durandal のいくつかのモジュールが定義されています。 define ステートメントは、モジュールの依存関係を解決して、関数でそれを使用できるようにするのに役立ちます。 最初にデバッグ メッセージを有効にして、アプリケーションが実行しているイベントに関するメッセージをコンソール ウィンドウに送信します。 app.start コードは、アプリケーションを起動するように Durandal フレームワークに指示します。 この規則は、Durandal がすべてのビューを認識し、ビューモデルがそれぞれ同じ名前の付いたフォルダーに含まれるように設定されています。 最後に、app.setRoot により、事前定義された entrance アニメーションを使用した shell の読み込みが開始されます。

define(['durandal/app', 
        'durandal/viewLocator', 
        'durandal/system', 
        'durandal/plugins/router'],
    function (app, viewLocator, system, router) {

    // Enable debug message to show in the console 
    system.debug(true);

    app.start().then(function () {
        router.useConvention();
        viewLocator.useConvention();
        //Show the app by setting the root view model for our application.
        app.setRoot('viewmodels/shell', 'entrance');
    });
});

ビュー

ビューは App/views フォルダー内にあります。

shell.html

shell.html には HTML のマスター レイアウトが含まれています。 他のすべてのビューは、shell ビュー内のどこかに構成されます。 ホット タオルでは、ヘッダー、コンテンツ領域、フッターの 3 つの領域で shell が用意されています。 これらの各領域では、要求されたときに他のビューからコンテンツが読み込まれます。

ヘッダーとフッターの compose バインドは、それぞれ nav ビューと footer ビューを指すように、ホット タオルでハードコーディングされています。 セクション #content の compose バインドは、router モジュールのアクティブな項目にバインドされます。 つまり、ナビゲーション リンクをクリックすると、この領域に対応するビューが読み込まれます。

<div>
    <header>
        <!--ko compose: {view: 'nav'} --><!--/ko-->
    </header>
     <section id="content" class="main container-fluid">
        <!--ko compose: {model: router.activeItem, 
            afterCompose: router.afterCompose, 
            transition: 'entrance'} -->
        <!--/ko-->
    </section>
    <footer>
        <!--ko compose: {view: 'footer'} --><!--/ko-->
    </footer>
</div>

nav.html には SPA のナビゲーション リンクが含まれています。 これは、メニュー構造などを配置できる場所です。 多くの場合、これは、router モジュールに (Knockout を使用して) バインドされたデータであり、shell.js で定義したナビゲーションを表示します。 Knockout はデータ バインド属性を検索し、それを shell ビューモデルにバインドしてナビゲーション ルートを表示します。router モジュールが、あるビューから別のビューに移動している間は、(Twitter Bootstrap を使用して) プログレスバーを表示します (router.isNavigating を参照)。

<nav class="navbar navbar-fixed-top">
    <div class="navbar-inner">
        <a class="brand" href="/">
            <span class="title">Hot Towel SPA</span> 
        </a>
        <div class="btn-group" data-bind="foreach: router.visibleRoutes">
            <a data-bind="css: { active: isActive }, attr: { href: hash }, text: name" 
                class="btn btn-info" href="#"></a>
        </div>
        <div class="loader pull-right" data-bind="css: { active: router.isNavigating }">
            <div class="progress progress-striped active page-progress-bar">
                <div class="bar" style="width: 100px;"></div>
            </div>
        </div>
    </div>
</nav>

home.html と details.html

これらのビューには、カスタム ビューの HTML が含まれます。 nav ビューのメニューの home リンクがクリックされると、home ビューは shell ビューのコンテンツ領域に配置されます。 これらのビューは拡張したり、独自のカスタム ビューに置き換えたりすることができます。

footer.html

footer.html には、shell ビューの下部にあるフッターに表示される HTML が含まれます。

ViewModel

ViewModel は App/viewmodels フォルダー内にあります。

shell.js

shell ビューモデルには、shell ビューにバインドされたプロパティと関数が含まれます。 多くの場合、ここにはメニュー ナビゲーション バインドが置かれています (router.mapNav ロジックを参照)。

define(['durandal/system', 'durandal/plugins/router', 'services/logger'],
    function (system, router, logger) {
        var shell = {
            activate: activate,
            router: router
        };

        return shell;

        function activate() {
            return boot();
        }

        function boot() {
            router.mapNav('home');
            router.mapNav('details');
            log('Hot Towel SPA Loaded!', null, true);
            return router.activate('home');
        }

        function log(msg, data, showToast) {
            logger.log(msg, data, system.getModuleId(shell), showToast);
        }
    });

home.js と details.js

これらのビューモデルには、home ビューにバインドされたプロパティと関数が含まれます。 また、ビューのプレゼンテーション ロジックも含まれており、データとビューを結び付けるものとなっています。

define(['services/logger'], function (logger) {
    var vm = {
        activate: activate,
        title: 'Home View'
    };

    return vm;

    function activate() {
        logger.log('Home View Activated', null, 'home', true);
        return true;
    }
});

サービス

サービスは App/services フォルダーにあります。 リモート データの取得と送信を担うデータサービス モジュールなど、将来のサービスの配置に最適です。

logger.js

ホット タオルでは、services フォルダーに logger モジュールが用意されています。 logger モジュールは、コンソールやポップアップ トーストでユーザーに表示するメッセージをログするのに最適です。