[只是想出一个模板化的blazor组件来做一个CRUD风格的单页应用程序,它可以传入一个特定的对象,所以我不必一遍又一遍地编写相同的样板代码。
例如,如下所示,可以使用RenderFragment对象将其部分模板化:
@typeparam TItem
<div>
@if (AddObjectTemplate != null)
{
@AddObjectTemplate
}
else
{
<div style="float:left">
<button class="btn btn-primary" @onclick="AddObject">Add Object</button>
</div>
}
</div>
@code {
[Parameter]
public RenderFragment AddObjectTemplate { get; set; }
[Parameter]
public IList<TItem> Items { get; set; }
}
但是更进一步,我可能想要这样的东西:
<button class="btn btn-default" @onclick="@(() => EditObject(item.Id))">Edit</button>
protected void EditObject(int id)
{
TItem cust = _itemServices.Details(id);
}
问题是,上面对EditObject(item.Id)的调用目前无法解析为特定对象,因为它不知道TItem是什么。有没有一种方法可以使用每个对象必须实现的模板组件中的特定接口,或者有另一种方法可以做到这一点?
这个想法是让AddObject,EditObject,DeleteObject等具有基本相同的功能,但是对象类型不同。
由于具有IList<TItem>
作为参数,所以该列表存在于该组件之外的组件结构的另一个级别。因此,最好将EventCallBack<T>
属性用于添加,编辑和删除方法,并在连接组件时设置实际的方法。这使您的模板组件仅成为渲染对象,并且使要完成的实际“工作”保持在需要完成工作的实际列表附近。