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 : "";
}
}
宣言された関数が何をするか(各列の幅を返すためにどのゾーンが入力されるかを計算します)を知っています。私の質問は、@関数ブロックの正しい使用法は何ですか、いつ使用する必要がありますか?
@functions
ブロックを使用すると、ユーティリティ関数を@Html
ヘルパーの拡張機能として追加したり、コントローラーに表示プロパティを通知したりするのではなく、ビューでユーティリティ関数を直接定義できます。次の条件を満たす場合に使用します。
if
ステートメントではなく、ビューの複数の場所で使用されます。Model
にすでに存在しています。最初のものに失敗した場合は、@Html
ヘルパーとして追加します。
2番目に失敗した場合は、インライン化します。
3番目のモデルが失敗した場合は、コントローラーで計算を行い、結果をモデルの一部として渡す必要があります。
他の人が@functions
の機能を説明しているので、再度ハッシュ化しません。しかし、私はこれを追加したいと思います:
ビューがビューモデルに型付けされている場合、実行可能なオプションは、このロジックをビューモデルに移動して、コードが多すぎてマークアップが乱雑にならないようにすることです。そうでなければ、あなたの見解はますます古典的なASP=のように見え始め、誰もそれを望んでいるとは思わない。
ビューで@functions
または@helper
を使用することに問題はないと思いますが、ビューでいくつかのメソッドを超えた場合、または関数が多少複雑な場合でも、可能であれば、ビューモデルにリファクタリングする価値があります。再利用できるコードの場合、それをヘルパークラスまたはHtmlHelperクラスの拡張機能に引き出すことをお勧めします。残念なことの1つは、既存のコードの一部を任意のビューで隠されていることを知らなかったため、コードを書き直しただけだということです。
msdn blogs から、@ functionsブロックは、メソッドやプロパティなどの再利用可能なコードをまとめることができます
この特定のケースでは、使用しているテーマを作成した人々は、おそらくそれをシンプルなテーマ(ビュー、CSS、およびイメージのみ)として保持しようと試みていました。
Orchardのテーマのコードを記述する必要がある場合は、モジュールを使用する必要があります(ここに記載されているように http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme =)このコードをビューで記述しない限り。
列のサイズを取得するためだけにテーマからモジュールに切り替えるのは時間の価値があるとは思えません。