SAPUI5 ODataModel V2使用read方法带筛选器时出现“无法读取undefined的substr属性”错误
SAPUI5 ODataModel V2使用read方法带筛选器时出现“无法读取undefined的substr属性”错误
看起来你遇到的问题大概率是重复的$filter参数导致OData服务解析出错啦!我帮你拆解下问题原因和解决办法:
问题根源
从你贴出的生成URL能看到,里面出现了两个$filter参数:
$filter=substringof(%271001%27,to_SalesOrder/SoldToParty)%20eq%20true&$expand=to_SalesOrder&$inlinecount=allpages&$filter=Material%20eq%20%271%27
这完全不符合OData的URL规范——OData请求里只能有一个$filter参数,多个筛选条件需要用and/or逻辑合并到同一个$filter里。这种重复参数会让OData服务返回异常响应,进而导致前端框架在解析响应时抛出“无法读取undefined的substr属性”这类底层错误。
修正后的代码实现
你需要把多个筛选条件组合成一个Filter对象,然后通过ODataModel的filters属性传递,而不是手动拼接URL参数。这样框架会自动帮你生成合规的OData请求:
// 先确保导入了Filter和FilterOperator // import Filter from "sap/ui/model/odata/Filter"; // import FilterOperator from "sap/ui/model/odata/FilterOperator"; let selectedMaterial = this.getModel("appSettings").getProperty("/selectedLineItemMaterial"); let selectedSoldToParty = this.getModel("salesDoc").getProperty("/SoldToParty"); this.oSalesContractModel = this.getModel("SalesContract"); if (selectedMaterial) { // 用AND逻辑组合两个筛选条件 const oCombinedFilter = new Filter({ filters: [ new Filter({ path: "to_SalesContract/SoldToParty", operator: FilterOperator.Contains, value1: selectedSoldToParty }), new Filter({ path: "Material", operator: FilterOperator.EQ, value1: selectedMaterial }) ], and: true // 默认就是AND逻辑,可省略 }); this.oSalesContractModel.read('A_SalesContractItem', { urlParameters: { "$expand": "to_SalesContract", "$inlinecount": "allpages" }, filters: oCombinedFilter, // 这里传递组合后的筛选器 success: (oResponse) => { // 成功获取数据后的处理逻辑 console.log("数据读取成功", oResponse); }, error: (oError) => { // 错误处理逻辑 console.error("读取数据失败", oError); } }); }
关键注意点
- 永远不要手动在
urlParameters里添加$filter,一定要用ODataModel提供的filters属性传递筛选条件,框架会自动处理参数拼接、编码和逻辑组合。 - 确认你已经正确导入了
Filter和FilterOperator类,避免因未导入导致的其他错误。
备注:内容来源于stack exchange,提问作者MarcL
相关产品推荐
相关产品推荐

