236 votes

Comment créer une fonction dans un modèle cshtml ?

Je dois créer une fonction qui n'est nécessaire que dans un seul fichier cshtml. Vous pouvez considérer ma situation comme des méthodes de page ASP.NET, qui sont de minuscules services Web mis en œuvre dans une page, car ils sont limités à une page. Je connais les aides HTML (méthodes d'extension), mais ma fonction n'est nécessaire que dans un seul fichier cshtml. Je ne sais pas comment créer une signature de fonction dans une vue. Note : J'utilise le moteur de template Razor.

0 votes

446voto

iwayneo Points 4880

pourquoi ne pas simplement déclarer cette fonction dans le fichier cshtml ?

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

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

35 votes

Ceci devrait être marqué comme la réponse, car la directive @functions répond spécifiquement aux exigences du PO. La fonction Helpers est destinée à une utilisation partagée entre plusieurs fichiers de modèles en plaçant le fichier avec la directive @helper dans un répertoire App_Code. En revanche, la directive @functions permet à une fonction d'être utilisée uniquement par le modèle qui la déclare.

0 votes

Je ne voulais pas dire quoi que ce soit mais le PO a dit "mais ma fonction est juste nécessaire dans un fichier cshtml" - ma réponse fait exactement cela alors que la réponse marquée ne le fait pas.

0 votes

@stimpy77 Pouvez-vous fournir une source pour "La fonction d'aide est" ? prévu pour une utilisation partagée entre plusieurs fichiers de modèles" ? Voir ASP.NET MVC 3 et la syntaxe d'aide dans Razor dans le blog de ScottGu.

300voto

Daniel Liuzzi Points 4709

Vous pouvez utiliser la directive @helper Razor :

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

Ensuite, vous l'invoquez comme ceci :

@WelcomeMessage("John Smith")

13 votes

Vous ne pouvez pas placer de balises dans le champ @functions méthodes, donc j'aime cette réponse.

1 votes

Oui, c'est bien mieux que de déclarer une fonction. C'est beaucoup plus direct.

2 votes

Mais vous ne pouvez pas renvoyer de variables (d'où le mot "fonction").

27voto

Hasan Khan Points 20723

Si votre méthode ne doit pas retourner du html et doit faire autre chose, vous pouvez utiliser un lambda au lieu d'une méthode d'aide dans Razor.

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

0 votes

C'est cependant utile si vous avez besoin d'accéder aux variables globales de la page dans votre fonction, y a-t-il un autre moyen de le faire ? :/

9voto

archil Points 21369

Jetez un coup d'œil à Aides déclaratives du rasoir

4voto

Petr Voborník Points 51

Dans ASP.NET Core Razor Pages, vous pouvez combiner C# et HTML dans la fonction :

@model PagerModel
@{
}

@functions 
{
    void PagerNumber(int pageNumber, int currentPage)
    {
        if (pageNumber == currentPage)
        {
            <span class="page-number-current">@pageNumber</span>
        }
        else
        {
            <a class="page-number-other" href="http://stackoverflow.com/table/@pageNumber">@pageNumber</a>
        }
    }
}

<p>@PagerNumber(1,2) @PagerNumber(2,2) @PagerNumber(3,2)</p>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X