13

VS2012でDurandalJSStarterKitテンプレートを入手しました...すべてうまく機能します...

しかし、いくつかの見解では、私はそのようなことをする必要があります:

@if (Roles.IsUserInRole("Administrators"))
{
   <p>Test</p>
}

ただし、durandalを使用すると、すべてのビューは「.html」ファイルになります...「。cshtml」ファイルを使用して、そのような情報にアクセスすることは可能ですか?

または、durandalでそれを行う他の方法はありますか?

ジュニア

4

8 に答える 8

32

私はこのようにやっています:

  1. Durandal ビューの汎用コントローラーを作成します。

    public class DurandalViewController : Controller
    {
      //
      // GET: /App/views/{viewName}.html
      [HttpGet]
      public ActionResult Get(string viewName)
      {
        return View("~/App/views/" + viewName + ".cshtml");
      }
    }
    
  2. ルートを登録します。

    routes.MapRoute(
        name: "Durandal App Views",
        url: "App/views/{viewName}.html",
        defaults: new { controller = "DurandalView", action = "Get" }
    );
    
  3. Views/web.config を /App/views/web.config にコピーします (Razor ビューがこの場所で機能するようにします)。

これにより、通常の Durandal 規則 (ビューの html 拡張子も含む) を使用し、サーバー コードを追加しなくても durandal ビューを通常の場所に cshtml ファイルとして配置できます。

静的 html ビューもある場合は、cshtml ビューをサブフォルダーに配置するか、通常の MVC /Views フォルダーを使用することもできます。

于 2013-03-26T12:07:44.493 に答える
8

Durandal で ASP.NET MVC を使用することはお勧めしません。

おそらく、ASP.NET MVC とは独立して存在するRazor ビュー エンジンを使用することです(コンパイラ、厳密な型指定などの利点を得るために)。Durandal.js アプリケーションを非常に効率的に作成するには、データ I/O 用の WebAPI だけで十分です。

Durandal および Knockout で Razor/CSHTML を使用することに興味がある場合は、 FluentKnockoutHelpersと呼ばれるオープン ソース オプションがあり、まさにあなたが探しているものである可能性があります。ASP.NET MVC の「優れた」部分の多くを提供するため、Durandal と Knockout の優れた機能をほとんど問題なく使用できます。

簡単に言えば、Durandal/Knockout 開発を ASP.NET MVC と同じくらい簡単にする一連の機能を提供します。(ほとんどの機能で、JavaScript モデルのベースとなる C# 型を提供するだけです。) 複雑なケースでは、JavaScript とコンパイルされていないマークアップを記述するだけで済みますが、これは避けられず、MVC と何ら変わりはありません。(MVC を除いて、コードは大きな jQuery の混乱になる可能性が高く、そもそも Durandal/Knockout を使用している理由です!)

特徴:

  • ASP.NET MVC に似た、厳密に型指定された流暢なラムダ式ヘルパーを使用して、簡単に Knockout 構文を生成します。
  • 構文生成のための豊富な IntelliSense とコンパイラのサポート
  • 流暢な構文により、カスタム ヘルパーを簡単に作成したり、組み込みの機能を拡張したりできます
  • ASP.NET MVC ヘルパーに代わる OSS: コミュニティの誰もが使用できるオプション機能を自由に追加してください
  • 現在/将来のすべてのアプリケーション タイプと変更に対して、数行のコードで .NET タイプと DataAnnotations に基づく検証を簡単に提供します。
  • クライアント側の JavaScript オブジェクト ファクトリ (C# 型に基づく) により、頭痛やサーバー トラフィックなしでリストなどに新しいアイテムを作成できます。

FluentKnockoutHelpers を使用しない例

<div class="control-group">
    <label for="FirstName" class="control-label">
        First Name
    </label>
    <div class="controls">
        <input type="text" data-bind="value: person.FirstName" id="FirstName" />
    </div>
</div>
<div class="control-group">
    <label for="LastName" class="control-label">
        Last Name
    </label>
    <div class="controls">
        <input type="text" data-bind="value: person.LastName" id="LastName" />
    </div>
</div>
<h2>
    Hello,
    <!-- ko text: person.FirstName --><!-- /ko -->
    <!-- ko text: person.LastName --><!-- /ko -->
</h2>

FluentKnockoutHelpers に .NET 型を提供すると、Intellisense と Razor / CSHTML のコンパイラを使用してスタイルでこれを行うことができます

@{
  var person = this.KnockoutHelperForType<Person>("person", true);
}

<div class="control-group">
    @person.LabelFor(x => x.FirstName).Class("control-label")
    <div class="controls">
        @person.BoundTextBoxFor(x => x.FirstName)
    </div>
</div>
<div class="control-group">
    @person.LabelFor(x => x.LastName).Class("control-label")
    <div class="controls">
        @person.BoundTextBoxFor(x => x.LastName)
    </div>
</div>
<h2>
    Hello,
    @person.BoundTextFor(x => x.FirstName)
    @person.BoundTextFor(x => x.LastName)
</h2>

重要な Durandal.js アプリケーションにおける FluentKnockoutHelper の機能の完全な概要については、SourceまたはLive Demoをご覧ください。

于 2013-05-17T05:53:43.093 に答える
7

はい、Durandal で cshtml ファイルを絶対に使用でき、サーバーで Razor を利用できます。これは、MVC が必要であることも意味していると思います。そのため、MVC も実行してそのルーティングを使用できます。

ルーティングが必要ない場合は、他のコメントが示唆するように、web.config で webpages.Enabled を設定できます。

<add key="webpages:Enabled" value="true" /> 
于 2013-02-24T18:46:00.107 に答える
5

.cshtml ファイルをビューとして直接使用することはお勧めしません。コントローラーの背後に .cshtml ファイルを配置することをお勧めします。

たとえば、HotTowel サンプルを使用して、/App/main.js を編集し、関数定義を次のように置き換えます。

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

Durandal viewEngine への参照を追加したことに注意してください。次に、交換する必要があります

viewLocator.useConvention();

viewLocator.useConvention('viewmodels', '../../dynamic'); 
viewEngine.viewExtension = '/';

viewLocation.useConvention の最初の引数は、ビュー モデル js ファイルの場所として /Apps/viewmodels/ ディレクトリを設定しますが、ビューの場所には URL http://example.com/dynamic/を使用し、拡張子は ' です。 /'. したがって、Durandal が「shell」という名前のビューを探している場合、http://example.com/dynamic/shell/を参照します(これは、ビュー ディレクトリが viewmodels ディレクトリに対して相対的にマッピングされているため、/App/viewmodels/ ../../dynamic は単純に /dynamic を提供します)。

慣例により、この以前の URL ( http://example.com/dynamic/shell/ ) はコントローラーの DynamicController とアクション "Shell" にマップされます。

この後、次のようにコントローラー (DynamicController.cs) を追加するだけです。

// will render dynamic views for Durandal
public class DynamicController : Controller
{
    public ActionResult Shell()
    {
        return View();
    }

    public ActionResult Home()
    {
        return View();
    }

    public ActionResult Nav()
    {
        return View();
    }

    public ActionResult Details()
    {
        return View();
    }

    public ActionResult Sessions()
    {
        return View();
    }

    public ActionResult Footer()
    {
        return View();
    }
}

上記のアクションごとに .cshtml ファイルを作成します。このようにして、コントローラー、サーバー側の IoC などを使用して、SPA の動的ビューを生成できます。

于 2013-03-21T04:12:19.257 に答える
2

DurandaljS は、主にシングルページ アプリ (SPA) の強固な基盤を形成するクライアント フレームワークです。サーバーテクノロジーとしてasp.net Web APIを使用していると思います。その場合、API コントローラー内でユーザーのロールを決定し、それに基づいてクライアントにデータを返すことができます。クライアントでは、Knockout の「if」バインディングを使用して、ページの特定の領域を表示/非表示にすることができます。

おそらくできることは、このコードを Index.cshtml に配置することです。

于 2013-02-24T15:44:57.860 に答える
2

次のリンクは、moduleid から viewid へのマッピングをカスタマイズする方法を示しています

http://durandaljs.com/documentation/View-Location/

慣例により、デュランダルは次の手順でビューの URL を見つけようとします

1)オブジェクトにgetView()domまたは文字列(ビューのurl)を返す関数があるかどうかを確認します

2) オブジェクトに getView 関数がない場合、オブジェクトにviewUrlプロパティがあるかどうかを確認します

3) 上記の 2 つの手順で URL の生成に失敗した場合、または DOM ビュー drundal がデフォルトの規則に陥った場合

main.jsで定義されたビュー URL (Views フォルダーのパス) を使用して、 moduleidxyz.jsをビューにマップします。xyz.html

したがって、moduleid xyz.js の場合、ビューのパスは次のようになります views/xyz.html

関数を上書きすることで、このデフォルトのマッピング動作を上書きできますconvertModuleIdToViewId

したがって、特定のモデル (.js オブジェクト) のビュー URL をカスタマイズする方法はたくさんあります。

于 2013-08-27T21:32:33.650 に答える
1

私はデュランダルの拡張機能を作成しました。これにより、cshtml ファイルに applicationHost div と一緒に applicationContent div を配置できるようになります。applicationContent では、ASP .Net MVC 構文とノックアウト バインディングの両方を使用できるようになりました。

私がしたことは、applicationContent div を探す viewLocator.js ファイルに追加のコードを追加したことだけです。

        locateViewForObject: function(obj, area, elementsToSearch) {
        var view;

        if (obj.getView) {
            view = obj.getView();
            if (view) {
                return this.locateView(view, area, elementsToSearch);
            }
        }

        if (obj.viewUrl) {
            return this.locateView(obj.viewUrl, area, elementsToSearch);
        }

        view = document.getElementById('applicationContent');
        if (view) {
            return this.locateView(view, area, elementsToSearch);
        }

        var id = system.getModuleId(obj);
        if (id) {
            return this.locateView(this.convertModuleIdToViewId(id), area, elementsToSearch);
        }

        return this.locateView(this.determineFallbackViewId(obj), area, elementsToSearch);
    },

元の cshtml ファイルで次のようなことができるようになりました。

<div class="row underheader" id="applicationContent">
<div class="small-5 columns">
    <div class="contentbox">
        @using (Html.BeginForm("Generate", "Barcode", FormMethod.Post, Attributes.Create()
                                                                                    .With("data-bind", "submit: generateBarcodes")))
        {
            <div class="row formrow">
                <label for="aantalBijlagen">@Translations.Label_AantalBijlagen</label>
            </div>
            <div class="row">
                <select name="aantalBijlagen" class="small-6 columns">
                    <option>0</option>
                    <option>1</option>
                    <option>2</option>
                    <option>3</option>
                    <option>4</option>
                </select>
            </div>
            <div class="row">
                <button class="button right" type="submit" id="loginbutton"><span class="glyphicon glyphicon-cog"></span> @Translations.Action_Generate</button>
            </div>
        }
    </div>
</div>
<div class="small-7 columns" data-bind="if: hasPdfUrl">
    <div class="contentbox lastcontent">
        <iframe data-bind="attr: {src: pdf_url}"></iframe>
    </div>
</div>

durandal プロジェクトの私の分岐点はここにあり、私がこれをどのように行ったかについての小さなブログ投稿はここにあります。

于 2014-02-09T10:01:40.707 に答える
0

私は DurandalJS にあまり詳しくありませんが、DurandalJS はクライアント側のシステムであるため、HTML マークアップを生成するためにサーバーで使用されるテクノロジに違いはありません。したがって、Razor CSHTML ファイルを使用してサーバー上で HTML を生成する場合、DurandalJS は問題なく動作するはずです。

特定のエラーが発生した場合は、そのエラーを共有してください。ただし、それが機能しない理由は考えられません。

于 2013-02-20T18:29:13.460 に答える