【发布时间】:2016-02-03 09:56:33
【问题描述】:
我正在开发 Web 应用程序(运输域)并使用 kendo UI 来获得外观和感觉。在使用剑道组合框时,我遇到了一个问题。在数据库中,我们在绑定到组合框的 Vessel 表中有数千条记录,如果用户想要查看所有船只(第一次),加载大约需要 6 秒,但第二次加载需要相同的时间时间也是(这就是这里的问题),即使它没有命中控制器中的 Action 方法(第二次)。我认为它的剑道对于组合框的默认功能是,如果所有记录都在第一次加载(没有过滤器),它不会向服务器发送请求以获取相同请求的响应,直到我们在组合框过滤器中输入某些内容,但是如果组合框正在获取从缓存加载,那么加载组合框不应花费相同的时间(6 秒)。我已经在剑道组合框文档中搜索了缓存选项,但没有运气:(直到现在。 这是我的剑道组合框代码:-
@(Html.Kendo().ComboBoxFor(i => i.VesselId)
.Name("VesselId").HtmlAttributes(new { style = "width:100%" })
.DataTextField("VesselName")
.Placeholder("Select Vessel...")
.DataValueField("VesselId")
.Filter(FilterType.Contains)
.AutoBind(false)
.MinLength(1)
.Value(proFormaVesselId)
.Text(proFormaVesselName)
.DataSource(source =>
{
source.Custom()
.ServerFiltering(true)
.Type("aspnetmvc-ajax")
.Transport(transport =>
{
transport.Read("GetFilteredVessels", "Common");
})
.Schema(schema =>
{
schema.Data("Data").Total("Total");
});
})
.Events(eve => eve.Change(@<text>
function () {
if (this.value() && this.selectedIndex == -1)
{
var dt = this.dataSource._data[0];
this.text('');
}
}
</text>
))
)
这里是动作方法:-
public JsonResult GetFilteredVessels([DataSourceRequest] DataSourceRequest request)
{
var data = _IVesselService.GetVessel().Select(x => new
{
VesselId = x.VesselId,
VesselName = x.Status == (byte)enumRecordStatus.Accepted ? x.VesselName : (x.Status == (byte)enumRecordStatus.Draft ? x.VesselName + "(D)" : x.VesselName + "(R)")
}).OrderBy(x => x.VesselName);
var result= Json(data.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
result.MaxJsonLength = int.MaxValue;
return result;
}
请不要对这行代码感到困惑result.MaxJsonLength = int.MaxValue; 之前我收到关于 json 长度太高的错误,所以我已经这样解决了。
现在组合框已加载并花费了 6 秒,但是当我第二次尝试加载相同的记录(所有记录)时,它再次花费了 6 秒,即使我在 GetFilteredVessels ActionMethod 上放置的断点也没有被击中。如果组合框从缓存中获取负载,那么为什么需要 6 秒?
我希望你理解我的问题,如果不是请评论我可以解释更多。
提前致谢。
【问题讨论】:
-
如果您将数千条记录加载到组合框中,那么这就是将数千个对象加载到 DOM 中,这可能需要花费时间。我建议您查看启用组合框的
virtualization功能或在组合框中显示适当数量的项目,例如一次100个。我遇到了类似的问题,我的响应时间从 6 秒以上变为即时更新。 -
感谢@DavidShorthose 的回复,是的,我在这里看到了演示demos.telerik.com/kendo-ui/combobox/virtualization
-
但是当我尝试使用 .Virtual() 方法时,它在这个版本中不可用我使用的是 2014.2.903.545 版本的剑道,你能告诉我我可以找到哪个版本的剑道这个方法?
-
2015 Q1 telerik.com/support/whats-new/kendo-ui/release-history/q1-2015 是引入虚拟化功能的时候。如果您也有有效的更新许可证,我建议您尝试一下。我还建议您对代码进行分支(假设您使用某种形式的源代码仓库),因为我认为从 2014 年到 2015 年发生了一些重大变化
-
非常感谢,上帝保佑你 :)
标签: asp.net-mvc caching kendo-ui kendo-combobox