cshtmlテンプレートで関数を作成する方法は?


219

1つのcshtmlファイル内でのみ必要な関数を作成する必要があります。私の状況はASP.NETページメソッドと考えることができます。これは、1つのページにスコープが設定されているため、ページに実装された最小のWebサービスです。HTMLヘルパー(拡張メソッド)については知っていますが、私の関数は1つのcshtmlファイルで必要なだけです。ビュー内に関数シグネチャを作成する方法がわかりません。 :私はRazorテンプレートエンジンを使用しています。

回答:


279

@helper Razorディレクティブを使用できます。

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}

次に、次のように呼び出します。

@WelcomeMessage("John Smith")

13
@functionsメソッド内にタグを置くことはできないので、この答えが好きです。
jfren484 2013年

1
はい、これは関数を宣言するよりもはるかに優れています。はるかに簡単です。
muglio 2015年

2
しかし、変数を返すことはできません(したがって、関数という単語)
Paul

@Paulどういう意味かわかりません。
Daniel Liuzzi 2016年

2
asp.netコアは@helperもサポートしていますか?
MuM6oJuM6o 2018

411

その関数をcshtmlファイル内で宣言しないのはなぜですか?

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()

32
@functionsディレクティブは特にOP要件を満たすため、これは答えとしてマークする必要があります。ヘルパー機能は、@ helperディレクティブを含むファイルをApp_Codeディレクトリに配置することにより、複数のテンプレートファイルで共有して使用することを目的としています。一方、@ functionsディレクティブでは、関数を宣言するテンプレートでのみ関数を使用できます。
ジョンデイビス

7
また、ヘルパーは他のかみそりヘルパーが既に行っているように文字列を返すことfunctionsに重点を置いているように見えるため、このソリューションはtoherの戻り値型により多くの柔軟性を提供します。私の本ではどちらの回答も+1になりますが、どちらも役立つ情報です。
AaronLS、2011年

8
@AaronLS公平に言うと、ヘルパーは文字列を返しませんが、IHtmlStringはHTMLエンコーディングを処理し、XSS攻撃からアプリを保護します。ヘルパーは、ヘルパー自体のRazor構文の便利さも提供します。これは、関数によって失われます。言い換えれば、<p>Welcome, @username.</p>return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");
Daniel Liuzzi

9
使用して@helper、単一のビューでは、しかし、他のビューが使用できるようにしていません。@helperの方が好きな理由は、中括弧の間にhtmlを挿入できるからです。 @functions(簡単に)それをさせません。
jfren484 2013年

5
記録のためだけです:@helper@functionsは両方とも多くのビューで共有でき、両方を宣言して単一のビューで使用できます(私は個人的に両方の共有/単一シナリオでの使用を見つけました)。それらの間の唯一の実用的な違いは、ビューヘルパーがレンダリングされたHTMLスニペット(またはより適切なHelperResultインスタンス)を返すための構文糖を追加するという事実ですが、ビュー関数は通常、単純な参照型または値型を返す場合にのみ役立ちます。
rsenna 2014年

25

メソッドがhtmlを返す必要がなく、他に何かをする必要がある場合は、Razorのヘルパーメソッドの代わりにラムダを使用できます。

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

3
それは機能しますが、単純さには程遠いです。私の神聖な本はシンプルです;)。しかし、代替案を提供してくれてありがとう。
Saeed Neamati

関数の中でページのグローバル変数にアクセスする必要がある場合、それを行う別の方法はありますか?:/
アレクサンドルドーブリコート


1

ページのグローバル変数にアクセスする場合は、次のようにできます。

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

C#7.0以降、これが唯一の適切で正しい答えです。GetLoadingState()これがローカル関数です。
Wolfrevo Cats
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.