web-dev-qa-db-ja.com

かみそりファイルの@functionsコードブロックは何をしますか、そして(もしあれば)それをいつ使用すべきですか?

Orchard CMSギャラリーからダウンロードしたテーマを調べていると、Layout.cshtmlファイルの先頭に次のコードブロックがあることがわかりました。

@functions {
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following.
string CalcuClassify(string[] zoneNames, string classNamePrefix)
{
    var zoneCounter = 0;
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray());
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : "";
}
}

宣言された関数が何をするか(各列の幅を返すためにどのゾーンが入力されるかを計算します)を知っています。私の質問は、@関数ブロックの正しい使用法は何ですか、いつ使用する必要がありますか?

42
Chris Payne

@functionsブロックを使用すると、ユーティリティ関数を@Htmlヘルパーの拡張機能として追加したり、コントローラーに表示プロパティを通知したりするのではなく、ビューでユーティリティ関数を直接定義できます。次の条件を満たす場合に使用します。

  1. この機能はビューと密接に関連しており、他の場所では一般的に役に立ちません(「列をどのくらいの幅にするか」など)。
  2. この機能は単なるifステートメントではなく、ビューの複数の場所で使用されます。
  3. 関数がロジックを決定するために必要なものはすべて、ビューのModelにすでに存在しています。

最初のものに失敗した場合は、@Htmlヘルパーとして追加します。

2番目に失敗した場合は、インライン化します。

3番目のモデルが失敗した場合は、コントローラーで計算を行い、結果をモデルの一部として渡す必要があります。

55
Bobson

他の人が@functionsの機能を説明しているので、再度ハッシュ化しません。しかし、私はこれを追加したいと思います:

ビューがビューモデルに型付けされている場合、実行可能なオプションは、このロジックをビューモデルに移動して、コードが多すぎてマークアップが乱雑にならないようにすることです。そうでなければ、あなたの見解はますます古典的なASP=のように見え始め、誰もそれを望んでいるとは思わない。

ビューで@functionsまたは@helperを使用することに問題はないと思いますが、ビューでいくつかのメソッドを超えた場合、または関数が多少複雑な場合でも、可能であれば、ビューモデルにリファクタリングする価値があります。再利用できるコードの場合、それをヘルパークラスまたはHtmlHelperクラスの拡張機能に引き出すことをお勧めします。残念なことの1つは、既存のコードの一部を任意のビューで隠されていることを知らなかったため、コードを書き直しただけだということです。

6
hawkke

msdn blogs から、@ functionsブロックは、メソッドやプロパティなどの再利用可能なコードをまとめることができます

0
paragy

この特定のケースでは、使用しているテーマを作成した人々は、おそらくそれをシンプルなテーマ(ビュー、CSS、およびイメージのみ)として保持しようと試みていました。

Orchardのテーマのコードを記述する必要がある場合は、モジュールを使用する必要があります(ここに記載されているように http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme =)このコードをビューで記述しない限り。

列のサイズを取得するためだけにテーマからモジュールに切り替えるのは時間の価値があるとは思えません。

0
cheesemacfly