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.