web-dev-qa-db-fra.com

Remplacement de @helper dans ASP.NET Core

Jusqu'à présent, je ne pense pas que ViewComponent résout que TagHelper non plus. Y a-t-il un remplacement à cela? Quelque chose qui prend des paramètres et renvoie un HtmlString?

Je ne vois rien de mal avec:

@helper foo(string something) {
     <div>Say @something</div>
}

var emailbody = classfilenameinAppCodefolder.foo("hello"); //store result in a variable for further processes

Pour l'instant, je pense que c'est une suppression temporaire avant RC. https://github.com/aspnet/Razor/issues/281 et https://github.com/aspnet/Mvc/issues/11 Eh bien! c'est mieux. J'espère que quelqu'un y travaille. Sans pour autant @helper, la construction d'un grand HtmlString ou d'un "modèle" serait une sérieuse douleur.

Remarque: la vue partielle ne semble pas faire l'affaire. Je pense que cela ne rend que les vues et ne renvoie pas la vue à la variable.

Deuxièmement, qu'est-il arrivé au dossier App_Code?

40
Ifeanyi Chukwu
@{
    Func<String, IHtmlContent> foo = @<div>Say @item</div>;
}
16
Alexaku

Je voudrais développer la réponse de @ Alexaku et montrer comment j'ai implémenté une fonction de type assistant. Il n'est utile que sur une page spécifique, mais il vous permet d'exécuter plusieurs fois un morceau de code de rasoir avec des paramètres d'entrée. La syntaxe n'est pas géniale mais je l'ai trouvée très utile en l'absence de la fonction @helper du rasoir. Déclarez d'abord une sorte de Dto qui contiendra les paramètres d'entrée dans la fonction.

@functions {
   private class Dto
   {
      public string Data { get;set; }
   }
}

Déclarez ensuite la fonction rasoir. Notez que la valeur displayItem peut être multiligne et notez également que vous accédez à la variable Dto à l'aide de @item.

@{
   Func<Dto, IHtmlContent> displayItem = @<span>@item.Data</span>;
}

Ensuite, lorsque vous souhaitez utiliser le modèle de rasoir, vous pouvez l'appeler comme suit de n'importe où dans la page.

<div>
   @displayItem(new Dto {Data = "testingData1" });
</div>
<div>
   @displayItem(new Dto {Data = "testingData2" });
</div>
9
Gary Brunton

Selon le problème Github suivant, il semble que @helper revienne et sera inclus dans l'aperçu 4 de asp .net core 3.0.0.

https://github.com/aspnet/AspNetCore/issues/511

[~ # ~] mise à jour [~ # ~]

À partir de asp .net core 3, vous pouvez maintenant définir une fonction locale dans un bloc de code Razor.

@{
    void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }

    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1#razor-code-blocks

Vous pouvez également utiliser la directive @functions comme ceci:

@{
    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

@functions {
    private void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1#functions

5
Gary Brunton

Le @helper directive a été supprimée car elle était incomplète et sa conception actuelle ne correspondait pas à la nouvelle 'méthode ASP.NET 5'. L'une des raisons est que les assistants doivent être déclarés dans le App_Code dossier tout en ASP.NET 5 n'a pas de concept de dossiers spéciaux . Par conséquent, l'équipe a décidé de supprimer temporairement la fonctionnalité.

Il est cependant prévu de le ramener à l'avenir. Voir ce et ce .

4
Henk Mollema

Vous pouvez facilement remplacer cette "fonctionnalité" par un ViewComponent (et un TagHelper si vous le souhaitez). ASP.NET Core est beaucoup plus convivial pour les concepteurs de sites Web, et les ViewComponents vous permettent d'écrire du HTML sans code de rasage (bizarre pour la plupart).

Par exemple:

  1. Créer un SayComponent : ViewComponent classe:

    public class SayComponent : ViewComponent
    {
        public void Render(string message)
        {
            return View(message);
        }
    }
    
  2. Créez un fichier de vue sous Views/Shared/Say/Default.cshtml avec juste

    @model string
    
    <div>Message: @Model.</div>
    
  3. Et appelez ça:

    @await Component.RenderAsync("Say", "some message")
    

Pour une meilleure expérience, ajoutez ceci à votre _ViewImports.cshtml fichier:

@addTagHelper *, YourSolutionName

Et puis vous pouvez l'utiliser comme assistant de balise:

<vc:say message="some message"></vc:say>
3
SO used to be good

Pour .NET Core 3, vous pouvez utiliser des fonctions locales:

@{
    void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }

    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1#razor-code-blocks

3
Scott