Que fait un code @functions dans un fichier de razor, et quand (si jamais) devrais-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 in the code block following. ssortingng CalcuClassify(ssortingng[] zoneNames, ssortingng classNamePrefix) { var zoneCounter = 0; var zoneNumsFilled = ssortingng.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToSsortingng() : ""; }).ToArray()); return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; } } 

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

Le bloc @functions vous permet de définir des fonctions d’utilitaire directement dans la vue, plutôt que de les append en tant qu’extensions à l’assistant @Html ou de laisser le contrôleur connaître les propriétés d’affichage. Vous souhaitez l’utiliser lorsque vous remplissez ces conditions:

  1. La fonctionnalité est étroitement liée à la vue et n’est généralement pas utile ailleurs (comme “Quelle est la largeur de mes colonnes”).
  2. La fonctionnalité est plus qu’une simple instruction if et / ou est utilisée à plusieurs endroits dans votre vue.
  3. Tout ce dont la fonction a besoin pour déterminer sa logique existe déjà dans le Model pour la vue.

Si vous échouez le premier, ajoutez-le en tant qu’assistant @Html .

Si vous échouez le deuxième, il suffit de l’inclure.

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

D’autres ont expliqué ce que @functions fonctions @functions donc je ne vais pas le répéter. Mais je voudrais append ceci:

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

Je ne pense pas qu’il y ait quelque chose de mal à utiliser @functions ou @helper dans votre vue, mais une fois que vous aurez dépassé quelques méthodes dans votre vue, ou même si la fonction est quelque peu compliquée, il pourrait être utile de modifier à tout le possible. Si le code peut être réutilisé, il peut être judicieux de le retirer dans une classe d’assistance ou une extension de la classe HtmlHelper. Une chose est que vous réalisez 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.

Depuis les blogs msdn, le bloc @functions vous permet de conclure un code réutilisable, comme les méthodes et les propriétés

Dans ce cas particulier, les personnes qui ont créé le thème que vous utilisez essayaient probablement de le garder comme un thème simple (uniquement les vues, les CSS et les 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 d’écrire ce code dans la vue.

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