Wie definiere ich eine Methode in Razor?


Antworten:


310

Lassen Sie alle Debatten darüber, wann (wenn überhaupt) es getan werden sollte, @functions so, wie Sie es tun.

@functions {

    // Add code here.

}

16
+1 danke, FYI es heißt Praktikabilität. MVC ist nicht das einzige Spiel in der Stadt. Einige Leute wie einfaches Rasiermesser und URLRewrite als MVC ist viel zu tun für wenig Nutzen IMO
Jason Sebring

5
@functionsist ein guter Ort, um den Ansichtsspezifischen Generierungscode zu organisieren . Ein
typisches Beispiel

1
Hallo David, wie kann ich die Funktion in einer Datei definieren und in einer anderen Datei verwenden?
Georgi Kovachev

Georgi, das nennt man "Razor HTML Helper". Grundsätzlich eine Klasse, die in Ihrem Code-Ordner definiert ist, mit einer Reihe von statischen Methoden, wie hier vorgeschlagen: asp.net/mvc/overview/older-versions-1/views/…
jeanie77

Georgi, vielleicht sind Sie inzwischen darauf gestoßen ... aber für die Wiederverwendung der Optionen <code> @functions </ code> oder <code> @helper </ code> Razor können Sie eine Datei wie Shared.cshtml in Ihrem App_Code verwenden Ordner. Dort können Sie <code> @functions {} </ code> oder <code> @helper MyFunction () {} </ code> definieren und in Ihren anderen Razor-Vorlagen wie <code> @ Shared.MyFunction () <verwenden / code> wo der Name der Datei wie der "Namespace" ist
Jamie Altizer

194

Du meinst Inline-Helfer?

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

@SayHello("John")

4
Ich möchte eine Methode definieren, die keinen MvcHtmlString, sondern einen C # -Typ zurückgibt.
Rookian

4
@Rookian, warum sollten Sie jemals C # -Code in eine Ansicht schreiben müssen? Ich meine, Schreibmethoden in einer Ansicht sind einfach falsch! Sie können Ihren C # -Code genau dort schreiben, wo er hingehört, und dann die Methode in einer Razor-Ansicht aufrufen, und genau das tun HTML-Helfer. Und sie sollen nicht immer einen MvcHtmlString zurückgeben.
Darin Dimitrov

1
@Rookian, vielleicht könntest du erklären, was du überhaupt versuchst. Was auch immer es ist, ich bin sicher, es gibt einen besseren Weg, als C # -Code in einer Ansicht zu schreiben :-)
Darin Dimitrov

1
Das ist fantastisch! Danke Darin ... gerade als ich denke ich weiß alles über MVC, kommst du mit und ich lerne etwas Neues :)
Serj Sagan

3
Das ASP.NET Core-Äquivalent ist der Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
Bieralkohol

34

Es ist sehr einfach, eine Funktion im Rasierer zu definieren.

@functions {

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

Sie können die Funktion also überall aufrufen. Mögen

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

Dieselbe Arbeit kann jedoch auch durchgeführt werden helper. Als Beispiel

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

Was ist der Unterschied? Laut diesem vorherigen Beitrag haben sowohl @helpers als auch @functions eines gemeinsam: Sie ermöglichen die Wiederverwendung von Code innerhalb von Webseiten. Sie haben noch etwas gemeinsam: Sie sehen auf den ersten Blick gleich aus, was zu Verwirrung bei ihren Rollen führen kann. Sie sind jedoch nicht gleich. Im Wesentlichen ist ein Helfer ein wiederverwendbarer Ausschnitt aus Razor sytnax, der als Methode verfügbar gemacht wird, und dient zum Rendern von HTML im Browser, während eine Funktion eine statische Dienstprogrammmethode ist, die von überall in Ihrer Webseitenanwendung aufgerufen werden kann. Der Rückgabetyp für einen Helfer ist immer HelperResult, während der Rückgabetyp für eine Funktion so ist, wie Sie es möchten.


2
Aufrufen der Funktion durch Weglassen des @FunctionsPräfixes, wie es @OrderedList(...)für mich in .netcore funktioniert.
Muflix

12

Sie können es auch mit einem Func wie diesem machen

@{
    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 ist nur ein Template-Motor.

Sie sollten eine reguläre Klasse erstellen.

Wenn Sie eine Methode innerhalb einer Razor-Seite erstellen möchten, fügen Sie sie in einen @functionsBlock ein .


1

Sie können sie einfach als lokale Funktionen in einem Rasierklingenblock deklarieren (dh @{}).

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

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

0

Sie können den @{ }Block auch einfach zum Erstellen von Funktionen verwenden:

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

Dann später auf Ihrer Rasierseite:

   <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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.