2 votes

Accéder à tous les ViewComponents disponibles sous forme de liste

Je voudrais rechercher dans une liste de tous les ViewComponents disponibles dans un projet asp.net core MVC (mvc6 ?), quelque chose comme ceci.

Default.cshtml pour ViewComponent

 foreach (var section in Model.sections)
{
    var sectionId = section.Id;
    if (_siteSettings.AvailableComponents.Any(c => c == sectionId))
    {
        @await Component.InvokeAsync(sectionId);
    }
    else
    {
        <p>Could not find component: @sectionId </p>            
    }        
}

J'ai réussi à le faire en enregistrant manuellement chaque composant dans une liste disponible au moment de l'exécution. Mais ce que j'aimerais accomplir est d'enregistrer chaque composant de vue simplement dans chaque fichier de classe de composant, comme ceci :

public class NewsList : ViewComponent
{

    private ISiteSettings _siteSettings;
    private string ComponentName = "NewsList";

    public NewsList(ISiteSettings siteSettings)
    {
        _siteSettings = siteSettings;

        _siteSettings.AvailableComponents.Add(ComponentName);
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {            
        return View();
    }
}

Le problème est que le constructeur de chaque composant de vue ne sera pas exécuté jusqu'à ce que le composant de vue soit rendu, j'ai besoin que tous les composants soient enregistrés "automatiquement" en quelque sorte. Cela est-il possible ?

1voto

Tyler Jennings Points 5271

Pour ce faire, vous devez utiliser la réflexion. Utilisation de Assembly vous pouvez obtenir tous les types dans votre projet, et ensuite filtrer où le type BaseType est typeof(ViewComponent) .

var listOfViewComponents = Assembly
                            .GetEntryAssembly()
                            .GetTypes()
                            .Where(x => x.GetTypeInfo().BaseType == typeof(ViewComponent));

J'espère que cela vous aidera.

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