Razorでメソッドを定義するにはどうすればよいですか?


回答:


310

実行する必要がある場合(ある場合)についての議論はそのままにして、@関数を使用して実行します。

@functions {

    // Add code here.

}

16
+1ありがとう、FYIはその実用性と呼ばれています。MVCは町で唯一のゲームではありません。単純なかみそりやURLRewriteが好きな人もいますが、MVCはIMOのメリットをほとんど享受できません
Jason Sebring

5
@functionsビュー固有の生成コードを整理するのに適した場所です。
適切

1
こんにちはデビッド、あるファイルで関数を定義して別のファイルで使用するにはどうすればよいですか?
Georgi Kovachev

ジョージ、これは「Razor HTML Helper」と呼ばれています。基本的には、静的メソッドのセットで、あなたのコードのフォルダに定義されたクラスは、ここで示唆したように:asp.net/mvc/overview/older-versions-1/views/...
jeanie77

Georgi、これまでにこれに遭遇したかもしれません...しかし、<code> @functions </ code>または<code> @helper </ code> Razorオプションを再利用するには、App_CodeでShared.cshtmlなどのファイルを使用できますフォルダ。そこで、<code> @functions {} </ code>または<code> @helper MyFunction(){} </ code>を定義して、<code> @ Shared.MyFunction()<のような他のRazorテンプレートで使用できます。 / code>ここで、ファイルの名前は「名前空間」のようなものです
Jamie Altizer

194

インラインヘルパーですか?

@helper SayHello(string name)
{
    <div>Hello @name</div>
}

@SayHello("John")

4
MvcHtmlStringではなくC#型を返すメソッドを定義したいと思います。
Rookian

4
@Rookian、なぜビューでC#コードを記述する必要があるのですか?ビューでのメソッドの記述が間違っていることを意味します!C#コードを完全に適切に記述し、Razorビューでメソッドを呼び出すことができます。これがまさにHTMLヘルパーが行うことです。また、常にMvcHtmlStringを返すことは想定されていません。
Darin Dimitrov 2011年

1
@ルーキアン、多分あなたはあなたが最初にやろうとしていることを説明できるでしょう。それが何であれ、ビューでC#コードを書くよりも、もっと良い方法があると確信しています:-)
Darin Dimitrov

1
これはすごい!ありがとうダーリン...ちょうど私がMVCについてすべてを知っていると思うとき、あなたは一緒に来て、私は何か新しいことを学びます:)
Serj Sagan

3
ASP.NETコアと同等のタグヘルパーです:docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/...
beercohol

34

かみそりの中で関数を定義するのはとても簡単です。

@functions {

    public static HtmlString OrderedList(IEnumerable<string> items)
    { }
}

したがって、どこでも関数を呼び出すことができます。お気に入り

@Functions.OrderedList(new[] { "Blue", "Red", "Green" })

ただし、これと同じ作業を行うことhelperもできます。例として

@helper OrderedList(IEnumerable<string> items){
    <ol>
        @foreach(var item in items){
            <li>@item</li>
        }
    </ol>
}

違いは何ですか?この以前の投稿によると、@ helpersと@functionsの両方が1つの共通点を共有しています。これらは、コードをWebページ内で再利用できるようにするものです。彼らはまた、もう1つの共通点を共有しています。一見すると同じに見えますが、そのために役割に少し混乱が生じる可能性があります。ただし、同じではありません。本質的に、ヘルパーはメソッドとして公開されたRazor sytnaxの再利用可能なスニペットであり、ブラウザにHTMLをレンダリングすることを目的としていますが、関数はWebページアプリケーション内のどこからでも呼び出すことができる静的ユーティリティメソッドです。ヘルパーの戻り値の型は常にHelperResultですが、関数の戻り値の型は任意です。


2
.netcoreで機能するように、@Functions接頭辞を省略して関数を呼び出す@OrderedList(...)
Muflix 2018

12

このようなFuncでそれを行うこともできます

@{
    var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}

<div style="@getStyle(50, 2)"></div>

10

Razorは単なるテンプレートエンジンです。

通常のクラスを作成する必要があります。

Razorページ内にメソッドを作成する場合は、それらを@functionsブロックに配置します


1

かみそりブロックでローカル関数として宣言することができます(つまり@{})。

@{
    int Add(int x, int y)
    {
        return x + y;
    }
}

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>

0

@{ }ブロックを使用して関数を作成することもできます。

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

その後、かみそりのページで:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>

0

MyModelVm.cs

public class MyModelVm
{
    public HttpStatusCode StatusCode { get; set; }
}

Index.cshtml

@model MyNamespace.MyModelVm
@functions
{
    string GetErrorMessage()
    {
        var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
        string errorMessage;
        if (isNotFound)
        {
            errorMessage = Resources.NotFoundMessage;
        }
        else
        {
            errorMessage = Resources.GeneralErrorMessage
        }

        return errorMessage;
    }
}

<div>
    @GetErrorMessage()
</div>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.