Come definisco un metodo in Razor?


Risposte:


318

Lasciando da solo qualsiasi dibattito su quando (se mai) dovrebbe essere fatto, @functions è come lo fai.

@functions {

    // Add code here.

}

16
+1 grazie, FYI si chiama praticità. MVC non è l'unico gioco in città. Ad alcune persone piace il semplice rasoio e URLRewrite come MVC è molto da fare per poco beneficio IMO
— Jason Sebring

5
@functionsè un buon posto per organizzare la visualizzazione del codice di generazione specifico . Caso in questione: quei brutti modelli client-da-stringhe ..
— user2864740

1
ciao David, come posso definire la funzione in un file e usarla in un altro file?
— Georgi Kovachev

Georgi, questo si chiama "Razor HTML Helper". Fondamentalmente, una classe definita nella cartella del codice, con una serie di metodi statici come suggerito qui: asp.net/mvc/overview/older-versions-1/views/…
— jeanie77

Georgi, potresti averlo trovato ormai ... ma per riutilizzare le opzioni <code> @functions </code> o <code> @helper </code> Razor puoi usare un file come Shared.cshtml nel tuo App_Code cartella. Lì puoi definire <code> @functions {} </code> o <code> @helper MyFunction () {} </code> e usarli negli altri tuoi modelli Razor come <code> @ Shared.MyFunction () < / code> dove il nome del file è come lo "spazio dei nomi"
— Jamie Altizer

199

Intendi helper in linea?

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

@SayHello("John")

5
Voglio definire un metodo che restituisca non un MvcHtmlString, ma un tipo C #.
— Rookian

4
@Rookian, perché mai dovresti scrivere codice C # in una vista? Voglio dire, scrivere metodi in una vista è semplicemente sbagliato! Potresti scrivere perfettamente il tuo codice C # ovunque appartenga e quindi richiamare il metodo in una visualizzazione Razor, ed è esattamente ciò che fanno gli helper HTML. E non dovrebbero restituire sempre un MvcHtmlString.
— Darin Dimitrov

1
@Rookian, forse potresti spiegare cosa stai cercando di fare in primo luogo. Qualunque cosa sia, sono sicuro che ci sia un modo migliore per farlo piuttosto che scrivere codice C # in una vista :-)
— Darin Dimitrov

1
Questo e spettacolare! Grazie Darin ... proprio quando penso di sapere tutto su MVC, vieni e imparo qualcosa di nuovo :)
— Serj Sagan

4
L'equivalente ASP.NET Core è Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
— beercohol

38

È molto semplice definire una funzione all'interno di razor.

@functions {

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

Quindi puoi chiamare una funzione ovunque. Piace

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

Tuttavia, questo stesso lavoro può essere svolto helperanche attraverso . Come esempio

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

Allora qual è la differenza? Secondo questo post precedente, sia @helpers che @functions condividono una cosa in comune: rendono il riutilizzo del codice una possibilità all'interno delle pagine Web. Condividono anche un'altra cosa in comune: a prima vista sembrano uguali, il che potrebbe causare un po 'di confusione sui loro ruoli. Tuttavia, non sono la stessa cosa. In sostanza, un helper è uno snippet riutilizzabile di Razor sytnax esposto come metodo ed è inteso per il rendering di HTML nel browser, mentre una funzione è un metodo di utilità statico che può essere chiamato da qualsiasi punto all'interno dell'applicazione Web Pages. Il tipo restituito per un helper è sempre HelperResult, mentre il tipo restituito per una funzione è qualunque cosa tu voglia che sia.


2
Chiamare la funzione omettendo il @Functionsprefisso come @OrderedList(...)funziona per me in .netcore.
— Muflix

13

Potresti anche farlo con una Func come questa

@{
    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 è solo un motore di creazione di modelli.

Dovresti creare una classe normale.

Se vuoi creare un metodo all'interno di una pagina Razor, inseriscili in un @functionsblocco .


2

Puoi semplicemente dichiararli come funzioni locali in un blocco rasoio (cioè @{}).

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

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

1

Puoi anche usare il @{ }blocco per creare funzioni:

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

Quindi più avanti nella tua pagina del rasoio:

   <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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.