DevExtreme SelectBox每次打开下拉框时刷新数据源并重新获取最新LoadParams的实现疑问
DevExtreme SelectBox每次打开下拉框时刷新数据源并重新获取最新LoadParams的实现疑问
嘿,我完全懂你的困扰——DevExtreme SelectBox默认会缓存首次加载的数据,哪怕你配置了动态的LoadParams,它也不会自动在每次打开下拉时重新请求服务器,导致最新的参数值没法传过去。别担心,咱们有几个靠谱的解决办法,保证每次打开下拉都能拿到最新数据:
方法一:利用onOpened事件手动触发数据源重载
这是最直接有效的方式,在下拉框每次打开时,主动调用数据源的reload()方法,强制它重新向服务器发起请求,同时重新执行你的getDynamicParams函数获取最新参数。
首先是ASP.NET MVC Razor的SelectBox配置:
@(Html.DevExtreme().SelectBox() .ID("dynamicSelectBox") .DataSource(ds => ds.Mvc() .Controller("YourDataController") .LoadAction("GetSelectBoxData") .LoadParams(new { json = new JS("getDynamicParams") }) ) .ValueExpr("Id") // 根据你的数据结构调整 .DisplayExpr("Name") // 根据你的数据结构调整 .OnOpened("onSelectBoxOpened") // 绑定打开事件 )
然后写对应的JavaScript函数:
// 动态获取最新参数的函数 function getDynamicParams() { // 这里根据你的实际场景获取最新值,比如从输入框、其他组件读取 return JSON.stringify({ EmployeeId: $("#employeeId").val(), DocumentDate: $("#documentDate").val() }); } // 下拉框打开时触发的函数 function onSelectBoxOpened() { // 获取SelectBox实例 const selectBoxInstance = $("#dynamicSelectBox").dxSelectBox("instance"); // 重载数据源,强制重新请求服务器 selectBoxInstance.getDataSource().reload(); }
方法二:禁用数据源缓存(可选,建议配合方法一使用)
你还可以给数据源配置CacheEnabled(false),让它默认不缓存请求结果,但有时候SelectBox的本地缓存逻辑可能还是会生效,所以最好和上面的onOpened重载方法结合使用,双重保险:
.DataSource(ds => ds.Mvc() .Controller("YourDataController") .LoadAction("GetSelectBoxData") .LoadParams(new { json = new JS("getDynamicParams") }) .CacheEnabled(false) // 禁用数据源缓存 )
服务器端参数接收示例
别忘了服务器端的Action要正确解析传递过来的参数,比如用Newtonsoft.Json反序列化:
using Newtonsoft.Json; public class DataParamsModel { public int EmployeeId { get; set; } public DateTime DocumentDate { get; set; } } public ActionResult GetSelectBoxData(string json) { // 解析客户端传递的参数 var paramsModel = JsonConvert.DeserializeObject<DataParamsModel>(json); // 根据最新的参数查询数据 var data = YourDataService.GetData(paramsModel.EmployeeId, paramsModel.DocumentDate); return Json(data, JsonRequestBehavior.AllowGet); }
这样配置之后,每次你打开SelectBox的下拉框,它都会重新调用getDynamicParams获取最新的EmployeeId和DocumentDate,然后向服务器发起新的请求,拿到最新的数据源啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

