gpt4 book ai didi

data-binding - 将 sap.ui.table.Table 的行绑定(bind)到 sap.ui.model.odata.v2.ODataModel 的方法 - url 中缺少参数

转载 作者:行者123 更新时间:2023-12-02 02:59:43 25 4
gpt4 key购买 nike

也许不需要告诉你,我一直在谷歌搜索、查看文档和规范,并进行了几天的测试,但现在没有成功。

我想要实现的目标:我不想将表格的行绑定(bind)到模型的具体实体(在我的例子中称为 Contragent),而是绑定(bind)到同样的模型,它接受一个参数,过滤 Contragents 并返回一个 IQueryable。我记得昨天阅读了一个 stackoverflow 问题 - 有人问是否可以仅使用 OData url 参数来实现 sql 'in' 子句。他们回答说,唯一的方法是构建 $filter=(Name eq 'test1' and Name eq 'test2' and ...) 形式的字符串。所以我认为如果我可以向我的 OData 服务添加一个自定义方法会很好,这样我就可以在 C# 中舒适地使用 LINQ。我在 OData 文档中看到,可以不请求模型的实体,而是通过编写正确的 URL 再次查询来自这种方法的数据。所以基本上,这就是我想要的 - 使用我创建的 OData 服务将我的 SAP 表绑定(bind)到 select * from Contragent where Name in (select Name from ...)

到目前为止我做了什么: 首先,我学习了如何向 OData 服务添加自定义服务方法。看起来它必须放在您初始化服务的同一个类中:

public class MyService : EntityFrameworkDataService<MyEntities>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config) {
// TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
// Examples:
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead | EntitySetRights.AllWrite);
//https://debugmode.net/2012/01/13/how-to-work-with-custom-method-in-wcf-data-service/
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); // for the custom method to be accessible via the service
config.UseVerboseErrors = true;
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}

private MyEntities entities = new MyEntities();
//https://learn.microsoft.com/en-us/dotnet/framework/data/wcf/service-operations-wcf-data-services
[WebGet] // this attribute is required - ^see the link above^
public IQueryable<Contragent> GetContragentsByIsContained(int isContained)
{
IQueryable<Contragent> result = entities.Contragent;
List<string> neededNames = GetNeededNames();
if (isContained == 0)
{
result = result.Where(x => !neededNames.Contains(x.Name));
}
else if (isContained == 1)
{
result = result.Where(x => neededNames.Contains(x.Name));
}
// else - no filtering

return result;
}
}

在那之后,我做了一些测试,我看到,两个 URL http://localhost:port/Services/MyService.svc/GetContragentsByIsContained?isContained=1http://localhost:port/Services/MyService.svc/GetContragentsByIsContained?isContained=0 运行良好。在那之后,我试图

.bindRows({
path: '/GetContragentsByIsContained?isContained=' + (typeof (isContained) === 'string' && isContained !== '' ? isContained: 2));
//...
});

我的表到这个结果,但它不起作用。

打开 Fiddler 查看发生了什么,告诉我问题出在哪里。我看到,SAP UI 5 发送了以下请求:400 HTTP localhost:port/Services/MyService.svc/GetContragentsByIsContained400 HTTP localhost:port/Services/MyService.svc/GetContragentsByIsContained? $skip=0&$top=25。我一点也不惊讶,服务器 400 对他们来说,因为......嘿,SAP,isContained 参数去哪儿了!?这让我在 Fiddler 或浏览器中做了另一个测试 - 没关系:http://localhost:port/Services/MyService.svc/GetContragentsByIsContained?isContained=1&$filter=(Name eq 'Test123')。有一个名为 Test123 的 Contragent,它在所需的名称中,因此 isContained=1 的查询返回 1 个项目,而 isContained=0 的查询不返回任何项目 - 同样符合预期。因此,对于 UI5 库来说,将以 $ 开头的特殊参数附加到我的 URL 的末尾应该不是问题,而无需删除我的参数 isContained。

那么,最后,问题本身:SAP 库在加载数据之前删除绑定(bind)路径中 ? 之后的所有内容是否正常?我怎样才能保留这个参数?提前致谢!

编辑:我忘了告诉你,我试着添加

urlParameters: {
"isContained": (typeof (isContained) === 'string' && isContained !== '' ? isContained : 2 )
}

就像我想做一个 read() 一样:

model.read("/GetContragentsByIsContained" {
urlParameters: {
"isContained": (typeof (isContained) === 'string' && isContained !== '' ? isContained : 2 )
},
success: function (count, args) {
debugger;
table.rows = count.results; // this doesn't work as well
},
error: function (args) {
debugger;
console.log(args);
}
});

它不起作用。

最佳答案

您可以在下面找到 XML View 中声明性聚合绑定(bind)的有效语法:

items="{
path: '/MySuperSet',
parameters: {
custom: {
foo: 'bar'
}
}
}"

请注意,无法传递以“$”开头的自定义参数。查看ODataListBinding类。

关于data-binding - 将 sap.ui.table.Table 的行绑定(bind)到 sap.ui.model.odata.v2.ODataModel 的方法 - url 中缺少参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46972265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com