Asp.net core 是否可以在ASP.Net.Core 2.2+;中将viewcomponents动态添加到razor页面;?
我正在编写一个非常简单的内容管理系统,我想知道是否有可能动态地将一个ViewComponent(或其他活动元素)和一个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
多亏了@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的内容都会引起痛苦