You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:44:33