Comment définir une méthode dans Razor?

213

Comment définir une méthode dans Razor?

Rookian
la source
1
Pour ceux qui voulaient voir quelles sont les options: Il y a deux façons de le faire. Une. en utilisant "@function" et un autre en utilisant "@helper". La différence entre eux est bien expliquée ici. mikesdotnetting.com/article/173/…
b1k

Réponses:

310

Laissant seuls les débats sur le moment où (si jamais) cela devrait être fait, @functions est la façon dont vous le faites.

@functions {

    // Add code here.

}
David Ruttka
la source
16
+1 merci, pour info, c'est ce qu'on appelle le caractère pratique. MVC n'est pas le seul jeu en ville. Certaines personnes aiment tout simplement le rasoir et URLRewrite car MVC est beaucoup à faire pour peu d'avantages IMO
Jason Sebring
5
@functionsest un bon endroit pour organiser l' affichage du code de génération spécifique .
Exemple
1
salut David, comment puis-je définir la fonction dans un fichier et l'utiliser dans un autre fichier?
Georgi Kovachev
Georgi, cela s'appelle "Razor HTML Helper". Fondamentalement, une classe définie dans votre dossier Code, avec un ensemble de méthodes statiques comme suggéré ici: asp.net/mvc/overview/older-versions-1/views/…
jeanie77
Georgi, vous l'avez peut-être déjà rencontré ... mais pour réutiliser les options de rasoir <code> @functions </code> ou <code> @helper </code>, vous pouvez utiliser un fichier tel que Shared.cshtml dans votre App_Code dossier. Vous pouvez y définir <code> @functions {} </code> ou <code> @helper MyFunction () {} </code> et les utiliser dans vos autres modèles Razor comme <code> @ Shared.MyFunction () < / code> où le nom du fichier est comme "l'espace de noms"
Jamie Altizer
194

Tu veux dire aide en ligne?

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

@SayHello("John")
Darin Dimitrov
la source
4
Je veux définir une méthode qui renvoie non pas un MvcHtmlString, mais un type C #.
Rookian
4
@Rookian, pourquoi auriez-vous besoin d'écrire du code C # dans une vue? Je veux dire que l'écriture de méthodes dans une vue est tout simplement fausse! Vous pouvez parfaitement écrire votre code C # où qu'il se trouve, puis appeler la méthode dans une vue Razor, et c'est exactement ce que font les assistants HTML. Et ils ne sont pas censés renvoyer toujours un MvcHtmlString.
Darin Dimitrov
1
@Rookian, vous pourriez peut-être expliquer ce que vous essayez de faire en premier lieu. Quoi qu'il en soit, je suis sûr qu'il existe une meilleure façon de le faire plutôt que d'écrire du code C # dans une vue :-)
Darin Dimitrov
1
C'est génial! Merci Darin ... juste quand je pense que je sais tout sur MVC, tu viens et j'apprends quelque chose de nouveau :)
Serj Sagan
3
L'équivalent ASP.NET Core est le Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol
34

Il est très simple de définir une fonction à l'intérieur du rasoir.

@functions {

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

Vous pouvez donc appeler une fonction n'importe où. Comme

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

Cependant, ce même travail peut également être effectué helper. Par exemple

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

Alors, quelle est la difference?? Selon ce billet précédent, @helpers et @functions partagent une chose en commun: ils font de la réutilisation du code une possibilité dans les pages Web. Ils partagent également une autre chose en commun - ils se ressemblent à première vue, ce qui pourrait créer un peu de confusion dans leurs rôles. Mais ce ne sont pas les mêmes. En substance, un assistant est un extrait réutilisable de Razor sytnax exposé en tant que méthode, et est destiné au rendu HTML vers le navigateur, tandis qu'une fonction est une méthode utilitaire statique qui peut être appelée de n'importe où dans votre application Web Pages. Le type de retour pour une aide est toujours HelperResult, tandis que le type de retour pour une fonction est ce que vous voulez qu'elle soit.

gdmanandamohon
la source
2
Appel de la fonction en omettant le @Functionspréfixe comme @OrderedList(...)fonctionne pour moi dans .netcore.
Muflix
12

Vous pouvez également le faire avec un Func comme celui-ci

@{
    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>
Bokoskokos
la source
10

Razor n'est qu'un moteur de modèles.

Vous devez créer une classe régulière.

Si vous voulez créer une méthode à l'intérieur d'une page Razor, mettez-les dans un @functionsbloc .

SLaks
la source
1

Vous pouvez simplement les déclarer en tant que fonctions locales dans un bloc de rasoir (ie @{}).

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

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

Vous pouvez également simplement utiliser le @{ }bloc pour créer des fonctions:

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

Plus tard dans votre page rasoir:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>
Daniel
la source
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>
Joel Wiklund
la source