42

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 : "";
}
}

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

4

4 に答える 4

58

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

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

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

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

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

于 2012-12-20T15:44:04.150 に答える
6

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

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

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

于 2012-12-20T16:14:47.450 に答える
0

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

于 2012-12-20T15:31:09.810 に答える
0

この特定のケースでは、あなたが使用しているテーマを作成した人々は、おそらくそれを単純なテーマ (ビュー、CSS、および画像のみ) として維持しようとしていました。

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

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

于 2012-12-20T15:36:11.350 に答える