动态表格构建器
Ajax表格构建器可以用于构建从远程载入内容的Ajax表格,并带分页等支持。
创建Ajax表格
创建Ajax表格分为以下步骤
- 创建
AjaxTableBuilder
,并描画到模板 - 提供搜索地址,搜索地址返回
AjaxTableSearchResponse
的json- 搜索可以使用
IAjaxTableCallback
处理
- 搜索可以使用
创建Ajax表格的例子
添加控制器,提供表格页面和搜索接口。
添加src\Controllers\AjaxTableExampleController.cs
[ExportMany]
public class AjaxTableExampleController : ControllerBase {
[Action("example/ajax_table")]
public IActionResult AjaxTable() {
var table = new AjaxTableBuilder();
table.Id = "ExampleTable";
table.Target = "/example/ajax_table_search";
var searchBar = new AjaxTableSearchBarBuilder();
searchBar.TableId = table.Id;
searchBar.Conditions.Add(new FormField(new CheckBoxFieldAttribute("Deleted")));
return new TemplateResult("zkweb.examples/ajax_table.html", new { table, searchBar });
}
[Action("example/ajax_table_search", HttpMethods.POST)]
public IActionResult AjaxTableSearch() {
var json = Request.Get<string>("json");
var request = AjaxTableSearchRequest.FromJson(json);
var callbacks = new ExampleAjaxTableHandler().WithExtraHandlers();
var response = request.BuildResponse(callbacks);
return new JsonResult(response);
}
}
添加表格处理器
添加src\UIComponents\AjaxTableCallbacks\ExampleAjaxTableHandler.cs
public class ExampleAjaxTableHandler : AjaxTableHandlerBase<ExampleTable, long> {
public override void OnQuery(
AjaxTableSearchRequest request, ref IQueryable<ExampleTable> query) {
if (!string.IsNullOrEmpty(request.Keyword)) {
query = query.Where(q => q.Name.Contains(request.Keyword));
}
}
public override void OnSort(
AjaxTableSearchRequest request, ref IQueryable<ExampleTable> query) {
query = query.OrderByDescending(q => q.Id);
}
public override void OnSelect(
AjaxTableSearchRequest request, IList<EntityToTableRow<ExampleTable>> pairs) {
foreach (var pair in pairs) {
pair.Row["Id"] = pair.Entity.Id;
pair.Row["Name"] = pair.Entity.Name;
pair.Row["CreateTime"] = pair.Entity.CreateTime.ToClientTimeString();
pair.Row["UpdateTime"] = pair.Entity.UpdateTime.ToClientTimeString();
}
}
public override void OnResponse(AjaxTableSearchRequest request, AjaxTableSearchResponse response) {
response.Columns.AddIdColumn("Id");
response.Columns.AddMemberColumn("Name");
response.Columns.AddMemberColumn("CreateTime");
response.Columns.AddMemberColumn("UpdateTime");
}
}
添加模板文件
添加templates\zkweb.examples\ajax_table.html
{% use_title "Example Ajax Table" %}
{% include common.base/header.html %}
<div class="portlet">
<div class="portlet-title">
<div class="caption">
<i class="fa fa-table"></i>
<span class="caption-subject">Example Ajax Table</span>
<span class="caption-helper"></span>
</div>
{{ searchBar }}
</div>
<div class="portlet-body">
{{ table }}
</div>
</div>
{% include common.base/footer.html %}
效果如图
FAQ
表格构建器AjaxTableBuilder
必须和AjaxTableSearchBarBuilder
一起使用吗?
如果不需要使用搜索功能,AjaxTableBuilder
可以单独使用。
怎样构建AjaxTableSearchResponse
,例子中的BuildResponse
的作用是?
AjaxTableSearchResponse
包含了当前页序号(从1开始)和每行的数据等信息,可以自己构建,
也可以使用BuildResponse
函数构建,这个函数提供了从数据库获取数据并分页的功能,需要注册对应的领域服务。
为什么需要使用表格处理器,例子中的WithExtraHandlers
的意思是?
表格处理器主要用于支持在其他插件中扩展表格的内容,使用WithExtraHandlers
函数可以获取到所有关联的处理器。
提供关联处理器可以继承IAjaxTableExtraHander<TEntity, TPrimaryKey, THandler>
并注册到容器。
怎样自定义表格的样式?
需要指定自定义的表格样式时请修改AjaxTableBuilder.Template
,
并参考static/common.base.tmpl/ajaxTable.tmpl
的内容。
怎样添加自定义样式的列,例子中的AddMemberColumn
的作用是?
表格中的每个列都是一个AjaxTableColumn
对象,可以添加这个对象到response.Columns
中实现自定义样式。
AddMemberColumn
的源代码如下,其中的<%-%>
是通过underscore.js绑定对象时使用的模板格式。
public static AjaxTableColumn AddMemberColumn(
this IList<AjaxTableColumn> columns, string member, string width = null) {
var column = new AjaxTableColumn() {
Key = member,
Width = width,
HeadTemplate = HttpUtils.HtmlEncode(new T(member)),
CellTemplate = string.Format("<%-row.{0}%>", HttpUtils.HtmlEncode(member))
};
columns.Add(column);
return column;
}
Ajax表格通信时的数据结构是?