Come creare una funzione in un modello cshtml?


219

Devo creare una funzione che è necessaria solo all'interno di un file cshtml. Puoi pensare alla mia situazione come a metodi di pagina ASP.NET, che sono servizi Web min implementati in una pagina, perché sono mirati a una pagina. Conosco gli helper HTML (metodi di estensione), ma la mia funzione è necessaria solo in un file cshtml. Non so come creare una firma di funzione all'interno di una vista. Nota : sto usando il motore modello Razor.

Risposte:


279

Puoi usare la direttiva @helper Razor:

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

Quindi lo invochi in questo modo:

@WelcomeMessage("John Smith")

13
Non puoi inserire tag all'interno dei @functionsmetodi, quindi mi piace questa risposta.
jfren484,

1
Sì, è molto meglio che dichiarare una funzione. Molto più semplice.
muglio,

2
Ma non puoi restituire variabili (da qui la parola funzione)
Paul

@Paul Non capisco cosa intendi con questo.
Daniel Liuzzi,

2
Asp.net core supporta anche @helper?
MuM6oJuM6o

411

perché non dichiarare semplicemente quella funzione all'interno del file cshtml?

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

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

32
Questo dovrebbe essere contrassegnato come risposta, poiché la direttiva @functions soddisfa specificamente i requisiti del PO. La funzione Helpers è pensata per l'uso condiviso su più file modello inserendo il file con la direttiva @helper in una directory App_Code. Considerando che, la direttiva @functions consente a una funzione di essere utilizzata solo dal modello che la dichiara.
Jon Davis,

7
Inoltre, gli helper sembrano orientati a restituire le stringhe proprio come fanno già altri helper di rasoio, e quindi la functionssoluzione offre una maggiore flessibilità per i tipi di ritorno. Entrambe le risposte ottengono +1 nel mio libro, poiché sono entrambe utili bocconcini di informazioni.
AaronLS,

8
@AaronLS Per essere onesti, gli helper non restituiscono stringhe ma IHtmlString, che si occupa della codifica HTML per te e protegge la tua app dagli attacchi XSS. Gli helper ti danno anche la comodità della sintassi del rasoio nell'helper stesso, che perdi con le funzioni. In altre parole, <p>Welcome, @username.</p>contro return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");.
Daniel Liuzzi,

9
l'utilizzo @helperin una singola vista, tuttavia, non lo rende disponibile per altre viste. la ragione per cui mi piace @helper è che puoi mettere html tra le parentesi graffe. @functionsnon (facilmente) ti consente di farlo.
jfren484,

5
Solo per la cronaca: entrambi @helpere @functionspossono essere condivisi tra più viste ed entrambi possono essere dichiarati e utilizzati da un'unica vista (e ho trovato personalmente uso per loro in entrambi gli scenari condivisi / singoli). IMHO l'unica differenza pratica tra loro è il fatto che un helper della vista aggiunge zucchero sintattico per restituire frammenti HTML renderizzati (o, più appropriati, HelperResultistanze), mentre una funzione di vista è di solito utile solo per restituire semplici riferimenti o tipi di valore.
rsenna,

25

Se il tuo metodo non deve restituire html e deve fare qualcos'altro, puoi usare un lambda invece del metodo helper in 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
Funziona, ma è tutt'altro che semplice. Il mio libro sacro è semplicità;). Ma grazie per aver fornito alternative.
Saeed Neamati,

È utile se hai bisogno di accedere alle variabili globali della pagina nella tua funzione, c'è un altro modo per farlo? : /
Alexandre Daubricourt,


1

Se vuoi accedere alle variabili globali della tua pagina, puoi farlo:

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

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

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

Da C # 7.0 questa è l'unica risposta corretta e corretta. GetLoadingState()qui è la funzione locale.
Wolfrevo Cats,
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.