我想在asp.net核心MVC(mvc6?)项目中搜索所有可用ViewComponent的列表,类似这样。

ViewComponent的Default.cshtml

 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>
    }
}


现在,我设法通过在运行时可用的列表中手动注册每个组件来做到这一点。但是我想完成的就是简单地在每个组件类文件中注册每个视图组件,如下所示:

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();
    }
}


问题在于,每个viewcomponent的构造函数都必须等到viewcomponent呈现后才能执行,我需要以某种方式“自动”注册所有组件。那可能吗?

最佳答案

为此,您需要使用反射。使用Assembly,可以获得项目中的所有“类型”,然后过滤BaseTypetypeof(ViewComponent)的位置。

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


希望这可以帮助。

关于c# - 以列表访问所有可用的ViewComponents,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42833917/

10-09 01:34