如果选择标题而不是值,则 Breeze/Knockout 下拉值不会在数据库中更新

Posted

技术标签:

【中文标题】如果选择标题而不是值,则 Breeze/Knockout 下拉值不会在数据库中更新【英文标题】:Breeze/Knockout dropdown value is not updated in database if caption is selected instead of value 【发布时间】:2016-02-06 00:21:11 【问题描述】:

我在我的 .net 应用程序中使用 Breezejs 和 Durandal。

当我尝试编辑包含的部分时

1) 文本框

2) 带有标题和选项的下拉列表

3) 文本区域

4) 按钮

点击编辑按钮,我将这些控件与它们各自的值绑定(直到它工作正常)。

在我将文本框值更改为“test123”并将下拉值更改为“标题”并单击保存按钮后。在保存功能中,我正在创建修改状态的 Breeze 实体并更新它们,如下所示,

var personEntity = breeze.manager.createEntity('TableName',  Id: id , breeze.EntityState.Unchanged);
personEntity.entityAspect.entityState.setModified();
personEntity.name(name); //"test123"
personEntity.dropdownValue(status) //I have selected the caption, means value is undefined
personEntity.textArea(address); //No change

然后将 savechanges() 保存到 DB。

表格文本框中的值已正确更新,但下拉列表的值未更新(来自某个值 为空);

请建议我一些解决方案,以便我可以在选择标题时将空值保存在数据库中。

提前致谢......

【问题讨论】:

尝试使用'' 而不是null 您应该显示更多代码和 html 以了解何时调用保存更改、如何绑定属性等等。 如果您检查在 saveChanges 时发送到服务器的有效负载(例如,使用浏览器 F12 开发工具的“网络”选项卡),您是否看到正在发送的 dropdownValue? @Steve.... 我在网络选项卡中检查了下拉值是 Null。但 Db 仍然没有按 Null 值更新。 @JotaBe...... -- ----------------- function TaskListViewModel() var self = this; self.status= ko.observable(); self.lastName = ko.observable(); self.statusArray = ko.observableArray([ Choices: "Alignment Complete", Choices: 'PQR' ]); self.saveData = function () //创建和更新实体 saveChanges('Message'); 【参考方案1】:

问题是服务器上的ContextProvider 没有检测到dropdownValue 已更改。它通过查看entityAspect.originalValues 来确定更改的属性。由于您使用 dropdownValue = undefined 创建了一个新实体,并将其设置为 undefined,因此不会检测到任何更改。

更改您的代码以将 dropdownValue 初始化为其他内容:

var personEntity = breeze.manager.createEntity('TableName', 
     Id: id, dropdownValue: 'something' );
personEntity.name(name);
personEntity.dropdownValue(status);
personEntity.textArea(address);

【讨论】:

感谢您的回复......但在我的实体中总共有 10-15 个下拉菜单。在实体创建期间传递所有这些值是一种好习惯吗?你能建议一些其他的解决方案吗???

以上是关于如果选择标题而不是值,则 Breeze/Knockout 下拉值不会在数据库中更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 findOneAndUpdate() 时,如果没有提供值,如何保持字段不变(而不是用 null 覆盖)?

如果选择了特定的选择选项值,则显示 div

Python:如果存在值,则通过更新而不是覆盖来进行字典合并

如何在数据库中存储选择选项的名称而不是值

未选择的组合框当前值的 ListIndex

如果选择了 GridViewRow 则...否则