场景很简单:我有一个产品列表,在前端我在 oData 模型(“EditMode”)中动态创建一个属性。我仅将此属性用于前端以启用/禁用某些输入字段。
当我执行更新(POST)时,网关请求失败(400-bad request),因为产品实体上没有定义“EditMode”。
如何配置网关以忽略未定义的属性并仅从有效负载中获取所需的内容?
在发送请求之前从 oData 模型中删除此属性将是一种开销,它也会影响 UI ... :(
谢谢!
场景很简单:我有一个产品列表,在前端我在 oData 模型(“EditMode”)中动态创建一个属性。我仅将此属性用于前端以启用/禁用某些输入字段。
当我执行更新(POST)时,网关请求失败(400-bad request),因为产品实体上没有定义“EditMode”。
如何配置网关以忽略未定义的属性并仅从有效负载中获取所需的内容?
在发送请求之前从 oData 模型中删除此属性将是一种开销,它也会影响 UI ... :(
谢谢!
我认为将不属于数据模型的属性发送到服务器是一种非常糟糕的方法。OData 4.0 规范说(尽管 SAP GW 仍然是 OData 2.0):
6.2 有效载荷可扩展性
OData 根据特定格式支持有效负载的可扩展性。无论格式如何,如果接收方需要理解附加内容,以便根据指定的 OData-Version 标头正确解释有效负载,则不得存在其他内容。因此,客户端和服务必须准备好处理或安全忽略 OData-Version 标头指定的有效负载版本中未明确定义的任何内容。
SAP GW 通过取消请求并返回错误的请求响应来“处理”意外属性。我相信没有改变这种行为的选择,它也会破坏“OData”。
我假设您在前端使用 SAPUI5。有很多方法可以实现你真正想要的——我对此非常确定。但是在我的情况下,从来不需要更改“真实”数据,即添加“附加”属性。一种方法是将控件的可编辑属性绑定到类似的东西
"{view>/editmode}"
你可以猜到这是一个视图模型,也称为“视图模型模式”。这仅意味着您在控制器中(即在 onInit 中)创建一个 JSONModel,然后调用
this.getView().setModel(oModel, "view");
每当您想禁用/启用对控件集的编辑时,只需调用一次:
var bEditable = ...; // true or false
//...
this.getView().getModel("view").setProperty("/editMode", bEditable);
另一种选择是有 2 个不同的视图/目标,一个用于编辑模式,一个用于显示模式。如果您想遵循 Fiori 指南,我认为您应该使用此选项。由你决定...
这些选项假定您只使用一个标志来使“所有”控件可编辑或不可编辑。
如果您需要一些额外的建议,请确保发布一些代码以更好地说明您的问题。