2012-09-18 54 views
2

我想让ExtJS组合框返回值而不是显示值。ExtJS Combobox发布hiddenName值

这是我的问题。我使用ajax来获取组合框的数据,同时使用getForm()。load来加载组合框的选定值。在模型中,我返回了一个显示值和代码值。显示值分配给'name',代码值分配给'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%' 
     }, 

的另一件事是,当我设置“名称”为“DataTypeCde”的代码值得到展示,但一旦对ComboBox ajax的数据得到加载,显示值然后被显示值替换。

因此,我可以获取'hiddenName'来加载DataTypeCde值并将此值回传,或者获取组合框数据以预加载表单呈现。

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

更新: * UPDATE4:(后加入响应样本) *

让我解释一下我想达到更好的。

(1)在按照上面的代码将被显示... 如果数据类型=购物和DataTypeCde = SP 渲染会显示购物,这是我多么希望这是后组合框。 但是,一旦我将这个结果提交给控制器,“购物”将被返回而不是“SP”...这不是我想要的。 POST响应的

实施例...

id=1&DataType=Shopping

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

实施例...

id=1&DataTypeCde=SP

(3)通过使用设置名称字段的第二方法为“DataTypeCde”我们将得到直到代码显示的结果组合框数据被加载。所以要解决这个问题,我已经将“autoLoad”特性设置为true,所以组合框数据将自动加载到渲染中。此时ExtJS会将显示的“SP”代码替换为“Shopping”的显示值。 但是这个解决方案的一个问题是需要在开始时加载所有的组合框会显着降低页面加载速度。 POST响应

例...

id=1&DataTypeCde=SP

(Q)我的问题是...有没有一种方法来设置显示值显示为组合框,但不加载组合框数据,但将代码值取回显示值而不是显示值。

UPDATE2:

很抱歉的混乱,我忘了提我使用ASP.NET MVC4与ExtJS的。在我提到将回帖后回复给控制员的情况下。我的意思是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"}}

下面是阿贾克斯的数据组合框代码...

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

感谢

回答

2

我不太清楚你真正想要的...

name 这包括现场时被用作参数名form.submit()中的值。如果没有配置名称,则返回到inputId。为了防止字段被包含在表单提交中,请设置submitValue:false(这适用于任何字段类型)。

hiddenName 一个的名称底层隐藏领域,这将是同步与组合的底层值。

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

displayField其中包含显示该值的底层字段的名称。

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

submitValue: true

  • 的数据类型的valueField的值(*为防止设置submitValue: false *)
  • DataTypeCde与displayField的价值(防止删除hiddenName

评论基于编辑

...提交这一结果返回给控制器...

你是什么意思与提交给控制器?您的问题听起来并不常见,我认为您只是以错误的方式进行操作......“购物”是商店名称字段的值,标识为Id字段的值?

编辑

有没有一种方法来设置显示值显示为组合框 无需加载组合框数据

基本上不...你可以设定值属性这是显示的那个,但那将是在那种情况下承诺的那个。

但将代码值取回显示值而不是显示值。

不。没有代码值。基本上有一个价值场将是该领域的价值。

对于下面我假设组合店装有以下值{"id":"SP","Name":"Shopping"}

现场就像一个本地的HTML场接收的值时,这意味着你有一个。现在,当你使用隐藏名称,在你的情况下,数据类型以及名称,你的情况DataTypeCde你可以设置这个字段DataType=SP这将导致显示服务。为什么 - >该值导致商店内查找。如果没有找到该记录,则会显示该键。这意味着如果您将此组合设置为DataType=AP,则不会找到会导致组合显示AP的值。

你的回报

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

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

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

这将导致组合显示购物因为它将会被自动商店内查找的关键SP

,不要忘记:

  • 建议不要将字符串用作Id字段。
  • 默认idProperty设置为id。在你的情况下,这可能导致任何查找失败。我建议你设定储存读者中idPropertyidProperty: 'Id'

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

+0

感谢@sra,为突出对我来说,关键术语,非常有帮助。我也尝试了通过添加submitValue:false并删除hiddenName的建议。但是这只会阻止这个领域一起提交。从你的建议,我试图找到一个提交这个[post](http://stackoverflow.com/questions/5423136/extjs-how-to-submit-both-combobox-value-文字),但没有运气。 –

+0

@ STi88我编辑了我的帖子 – sra

+0

感谢@sra为您提供持续的支持。你可能是对的,我这样做的方式是错误的,这可能是因为我想要做的是不常见的......我已经添加了更多的实现细节,希望有人能指点我正确的道路。 –