Asp.net core 是否可以在ASP.Net.Core 2.2+;中将viewcomponents动态添加到razor页面;?

Asp.net core 是否可以在ASP.Net.Core 2.2+;中将viewcomponents动态添加到razor页面;?,asp.net-core,razor-pages,Asp.net Core,Razor Pages,我正在编写一个非常简单的内容管理系统,我想知道是否有可能动态地将一个ViewComponent(或其他活动元素)和一个Razor页面连接起来,最好是从一个数据库 我已经创建了一系列小部件,但我必须将它们放在页面上,然后根据用户的选择有选择地显示或隐藏它们。它工作得很好,但我认为一定有更好的方法 我已经看了一段时间了,我似乎找不到解决办法,或者你就是做不到 有什么想法吗 :) 多亏了@Arjun Vachhani,如果有人想试试的话,这就是我想到的 //item是一个类,包含ComponentN

我正在编写一个非常简单的内容管理系统,我想知道是否有可能动态地将一个ViewComponent(或其他活动元素)和一个Razor页面连接起来,最好是从一个数据库

我已经创建了一系列小部件,但我必须将它们放在页面上,然后根据用户的选择有选择地显示或隐藏它们。它工作得很好,但我认为一定有更好的方法

我已经看了一段时间了,我似乎找不到解决办法,或者你就是做不到

有什么想法吗

:)


多亏了@Arjun Vachhani,如果有人想试试的话,这就是我想到的

//item是一个类,包含
ComponentName
作为字符串属性和
Data
作为动态属性
@model
是这些类的
列表

public class MyClass
{
    public string ComponentName { get; set; }
    public dynamic Data { get; set; }
}
在我看来,我有

@model List<MyClass>

@foreach (var item in Model)
{
    @await Component.InvokeAsync(item.ComponentName, item.Data );
}
@型号列表
@foreach(模型中的var项目)
{
@wait Component.InvokeAsync(item.ComponentName,item.Data);
}
在控制器中(作为测试)

List List=新列表();
var定义=新的{id=”“};
var user=await\u adminService.GetUserByEmail(user.Identity.Name);
//每个组件有一个。您也可以通过'dbcontext'或'Service'方法轻松地从数据库中获取它们。
//在本例中,我希望登录的用户id来自Asp.Net.Identity,但也可以是您想要的任何参数。
添加(新的JsonApiResult{ComponentName=“componentName1”,Data=JsonConvert.DeserializeAnonymousType($”{id:{user.id}},definition)});
添加(新的JsonApiResult{ComponentName=“componentName2”,Data=JsonConvert.DeserializeAnonymousType($”{id:{user.id}},definition)});
//等等。。。
返回视图(列表);

我正在研究jQuery.Sortable,所以如果我得到了一个好的解决方案,我也会发布它。

您可以将视图组件的名称保存在数据库中,也可以选择将值传递到视图组件中。用户可以选择他感兴趣的组件。所选组件将保存在数据库中。在页面渲染过程中,通过选定组件循环并动态渲染

@* some other code *@
<div>
    @foreach(var component in Model.SelectedComponent)
    {
        <div class="component">
            @await Component.InvokeAsync(component.Name, component.OptionalJsonString)
        </div>
    }
</div>
@* some other code *@
下面是动态呈现组件的示例代码

@* some other code *@
<div>
    @foreach(var component in Model.SelectedComponent)
    {
        <div class="component">
            @await Component.InvokeAsync(component.Name, component.OptionalJsonString)
        </div>
    }
</div>
@* some other code *@
@*其他一些代码*@
@foreach(模型中的var组件。SelectedComponent)
{
@wait Component.InvokeAsync(Component.Name,Component.OptionalJsonString)
}
@*其他代码*@
这是一个如何做到这一点的想法。实施细节可能因您的需求而异


查看查看组件的官方文档以获取更多信息

PS:不要调用任何类
SomethingViewComponent
,因为我发现任何带有ViewComponent的内容都会引起痛苦