41 votes

À quoi sert un bloc de code @functions dans un fichier razor, et quand (si jamais) dois-je l'utiliser ?

En regardant un thème que j'ai téléchargé depuis la galerie Orchard CMS, j'ai remarqué qu'un fichier Layout.cshtml contenait ce bloc de code en haut du fichier :

@functions {
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following.
string CalcuClassify(string[] zoneNames, string classNamePrefix)
{
    var zoneCounter = 0;
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray());
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : "";
}
}

Je sais ce que fait la fonction déclarée (elle calcule quelles zones sont remplies afin de renvoyer la largeur de chaque colonne). Ma question est la suivante : quelle est l'utilisation correcte du bloc @function, et quand dois-je l'utiliser ?

55voto

Bobson Points 7610

El @functions vous permet de définir des fonctions utilitaires directement dans la vue, plutôt que de les ajouter en tant qu'extensions de la fonction @Html ou de faire connaître au contrôleur les propriétés d'affichage. Vous voudrez l'utiliser lorsque vous pourrez remplir ces conditions :

  1. La fonctionnalité est étroitement liée à la vue et n'est généralement pas utile ailleurs (par exemple, "Quelle largeur dois-je donner à mes colonnes").
  2. La fonctionnalité est plus qu'une simple if et/ou est utilisé à plusieurs endroits dans votre vue.
  3. Tout ce dont la fonction a besoin pour déterminer sa logique existe déjà dans le fichier Model pour la vue.

Si vous échouez à la première, ajoutez-la comme une @Html aide.

Si vous échouez au second, mettez-le en ligne.

Si vous échouez à la troisième étape, vous devez effectuer le calcul dans votre contrôleur et transmettre le résultat dans le modèle.

6voto

hawkke Points 2758

D'autres ont expliqué ce que @functions donc je ne vais pas revenir là-dessus. Mais je voudrais ajouter ceci :

Si votre vue est typée à un viewmodel, je pense qu'une option viable serait de déplacer cette logique dans le viewmodel pour éviter d'encombrer votre markup avec trop de code. Sinon, vos vues commencent à ressembler de plus en plus à de l'ASP classique et je pense que personne ne souhaite cela.

Je ne pense pas qu'il y ait quelque chose de mal à utiliser @functions o @helper dans votre vue, mais dès que vous dépassez un couple de méthodes dans votre vue, ou même si la fonction est quelque peu compliquée, il peut être utile de refactorer vers le modèle de vue si possible. Si le code peut être réutilisé, il peut être judicieux de l'extraire dans une classe d'aide ou une extension de la classe HtmlHelper. Une chose qui est une déception est de réaliser que vous venez de réécrire un morceau de code qui existait déjà parce que vous ne saviez pas qu'il était caché dans une vue arbitraire.

0voto

alliswell Points 3064

Desde blogs msdn , Le bloc @functions permet d'envelopper le code réutilisable, comme les méthodes et les propriétés.

0voto

cheesemacfly Points 5733

Dans ce cas particulier, les personnes qui ont créé le thème que vous utilisez ont probablement essayé de le garder comme un thème simple (seulement des vues, css et images).

Si vous avez besoin d'écrire du code pour un thème pour Orchard, vous devez vous tourner vers un module (comme indiqué ici : http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme ) à moins que vous n'écriviez ce code dans la vue.

Je ne suis pas sûr que cela vaille la peine de passer d'un thème à un module uniquement pour obtenir la taille d'une colonne.

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