ExtJS Combobox发布hiddenName值

时间:2012-09-18 19:26:27

标签: ajax extjs combobox extjs4.1

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

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

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

以下是代码:

{
            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%'
        },

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

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

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

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

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

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

POST响应示例...

  

id=1&DataType=Shopping

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

POST响应示例...

  

id=1&DataTypeCde=SP

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

POST响应示例...

  

id=1&DataTypeCde=SP

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

UPDATE2:

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

UPDATE3:

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

    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"}]

由于

1 个答案:

答案 0 :(得分:2)

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

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

<强> hiddenName 潜在隐藏字段的名称,该字段将同步与组合的基础

valueField 包含要与name属性一起提交的值的基础字段的名称。

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

使用您的设置,您应该提交两个值:

submitValue: true

  • DataType,其值为valueField(*以防止设置submitValue: false *)
  • DataTypeCde,其值为displayField(阻止删除hiddenName

基于修改的评论

  

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

提交控制器是什么意思?您的问题听起来不常见,我认为您只是以错误的方式执行...“购物”是商店名称字段的值和Id字段的值吗?

修改

  

有没有办法设置显示组合框的显示值   无需加载组合框数据

基本上不是......你可以设置value属性,这是一个显示的属性,但是在那种情况下会被提交。

  

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

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

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

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

您的回归

{"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' }