2

我试图让 ExtJS 组合框返回值而不是显示值。

这是我的问题。我正在使用 ajax 来获取组合框字段的数据,同时使用 getForm().load 来加载组合框的选定值。在模型中,我返回了一个显示值和代码值。显示值分配给“名称”,代码值分配给“隐藏名称”。当我提交数据时,提交的是显示值而不是“隐藏名称”字段中的代码值。

更改组合框的选择后,正在提交代码值。

这是代码:

{
            xtype: 'combobox',
            fieldLabel: 'Type',
            name: 'DataType',
            hiddenName: 'DataTypeCde',
            store: Ext.create('Ext.data.JsonStore', {
                proxy: {
                    type: 'ajax',
                    actionMethods: { create: 'POST', read: 'POST', update: 'POST', destroy: 'POST' },
                    url: '@Url.Content("~/{URL}/DataType")',
                    reader: {
                        type: 'json'
                    }
                },
                fields: ['Id', 'Name']
            }),
            valueField: 'Id',
            displayField: 'Name',
            typeAhead: true,
            mode: 'remote',
            emptyText: 'Select a data type...',
            anchor: '96%'
        },

另一件事是,当我将“名称”设置为“DataTypeCde”时,代码值会显示,但是一旦加载了组合框的 ajax 数据,显示值就会被显示值替换。

因此,我可以获取“hiddenName”来加载 DataTypeCde 值并将该值回发,或者获取组合框数据以在表单渲染上预加载。

有人可以指出是否有办法或我做错了什么来防止代码值被回发。

更新: *更新 4:(添加 POST 响应示例) *

让我更好地解释我想要实现的目标。

(1) 使用上面的代码将显示以下内容...如果 DataType = Shopping 和 DataTypeCde = SP 渲染后的组合框将显示 Shopping,这就是我想要的样子。但是,一旦我将此结果提交回控制器,就会返回“购物”而不是“SP”……这不是我想要的。

POST 响应示例...

id=1&DataType=Shopping

(2) 将名称字段设置为“DataTypeCde”,这将是以下结果...如果 DataType = Shopping 和 DataTypeCde = SP 渲染后的组合框将显示 SP,这不是我想要的,因为我想显示文本不是代码。但是一旦我将结果提交回控制器,就会返回代码“SP”,这就是我的意图。

POST 响应示例...

id=1&DataTypeCde=SP

(3) 使用第二种方法将name字段设置为“DataTypeCde”,我们将得到代码显示的结果,直到组合框数据被加载。因此,为了解决这个问题,我将“autoLoad”功能设置为 true,因此组合框数据将在渲染时自动加载。此时ExtJS会将显示的“SP”代码替换为“Shopping”的显示值。但是这个解决方案的一个问题是,要求所有的组合框在开始时加载会显着减慢页面加载速度。

POST 响应示例...

id=1&DataTypeCde=SP

(Q) 我的问题是......有没有办法在不加载组合框数据的情况下为组合框设置显示值,但是让代码值而不是显示值被回发。

更新2:

很抱歉造成混淆,我忘了提到我正在使用带有 ExtJs 的 ASP.NET MVC4。在我提到将发布响应返回给控制器的情况下。我的意思是 MVC 控制器。我认为后端与这个问题无关。

更新3:

为了更全面地了解我的实现,这里是我用来加载表单的代码和数据示例。

    example2.getForm().load({
    url: '@Url.Content("~/{URL}/Data/")',
    params: {
        id: window.record.data['id']
    },
    method: 'POST'
});

上面加载了一个类似于这个的 json 对象的集合......

{"success":true,"data":{"id":"1","DataType":"Shopping","DataTypeCde":"SP"}}

这是为组合框 ajax 数据的代码...

store: Ext.create('Ext.data.JsonStore', {
            proxy: {
                type: 'ajax',
                actionMethods: { create: 'POST', read: 'POST', update: 'POST', destroy: 'POST' },
                url: '@Url.Content("~/{URL}/DataType")',
                reader: {
                    type: 'json'
                }
            },
            fields: ['Id', 'Name']
        }),

使用这样的结果 json 对象...

[{"Id":"SP","Name":"Shopping"}]

谢谢

4

1 回答 1

2

我不太确定你真正想要什么...

name 当在 form.submit() 中包含字段值时,它用作参数名称。如果未配置名称,则回退到 inputId。要防止字段包含在表单提交中,请设置 submitValue: false (这适用于任何字段类型)。

hiddenName 将与组合的基础同步的基础隐藏字段的名称。

valueField 基础字段的名称,其中包含要提交的值以及 name 属性。

displayField 包含要显示的值的基础字段的名称。

通过您的设置,您应该提交两个值:

submitValue: true

  • DataType 与 valueField 的值(*为了防止设置submitValue: false*)
  • DataTypeCde 与 displayField 的值(为了防止删除hiddenName

基于编辑的评论

...将此结果提交回控制器...

提交给控制器是什么意思?你的问题听起来不常见,我认为你只是做错了......“购物”是你商店的 Name 字段的值,而 SD 是 Id 字段的值吗?

编辑

有没有办法在不加载组合框数据的情况下设置组合框的显示值

基本上不是......您可以设置 value 属性,该属性是显示的属性,但在这种情况下将是提交的属性。

但是让代码值而不是显示值被回发。

不,没有代码值。基本上有一个 valueField 将是该字段的值。

对于以下内容,我假设组合商店加载了以下值{"id":"SP","Name":"Shopping"}

该字段的行为类似于原生 HTML 字段,这意味着您在接收值时具有名称和值。现在,当您使用 hiddenName 时,在您的情况下为DataType以及名称,在您的情况下为DataTypeCde,您可以设置此字段,从而显示服务。为什么 -> 该值会导致在商店内进行查找。如果未找到记录,则将显示密钥。这意味着如果您将此组合设置为没有值,则可以找到这将导致组合显示。DataType=SPDataType=APAP

你的回报

{"success":true,"data":{"id":"1","DataType":"Shopping","DataTypeCde":"SP"}}

包含重复数据。您应该只提交组合名称以及 valueField 值。它应该看起来像

{"success":true,"data":{"id":"1","DataType":"SP"}}

这将导致组合显示购物,因为它会自动在商店中查找键SP

不要忘记:

  • 不建议使用字符串作为 Id 字段。
  • 默认idProperty设置为id。在您的情况下,这可能会导致任何查找失败。我建议您将idProperty商店内阅读器设置为idProperty: 'Id'

    reader: { type: 'json', idProperty: 'Id' }

于 2012-09-19T06:57:22.873 回答