2

ExtJSコンボボックスに表示値ではなく戻り値を取得しようとしています。

これが私の問題です。私は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%'
        },

もう1つは、「name」を「DataTypeCde」に設定すると、コード値が表示されますが、コンボボックスのajaxデータが読み込まれると、表示値が表示値に置き換えられます。

したがって、「hiddenName」を取得してDataTypeCde値をロードし、この値をポストバックするか、コンボボックスデータを取得してフォームレンダリングでプリロードすることができます。

コード値がポストバックされないようにする方法や私が間違っていることを誰かが指摘できますか?

更新: * Update4 :( 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)名前フィールドを「DataTypeCde」に設定する2番目の方法を使用すると、コンボボックスデータがロードされるまでコード表示の結果が得られます。したがって、この問題を解決するために、「autoLoad」機能をtrueに設定しました。これにより、コンボボックスデータがレンダリング時に自動的にロードされます。この時点で、ExtJSは、表示されている「SP」コードを「ショッピング」の表示値に置き換えます。ただし、このソリューションの問題の1つは、最初にすべてのコンボボックスをロードする必要があると、ページのロードが大幅に遅くなることです。

POST応答の例...

id=1&DataTypeCde=SP

(Q)私の質問は...コンボボックスデータをロードせずにコンボボックスに表示する表示値を設定する方法はありますが、表示値の代わりにコード値がポストバックされます。

Update2:

混乱して申し訳ありませんが、ExtJでASP.NETMVC4を使用していることを忘れてしまいました。ポストレスポンスをコントローラーに返すことに言及した場合。私は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"}]

ありがとう

4

1 に答える 1

2

あなたが本当に何を望んでいるのかよくわかりません...

name これは、form.submit()にフィールド値を含めるときにパラメーター名として使用されます。名前が設定されていない場合は、inputIdにフォールバックします。フィールドがフォームsubmitに含まれないようにするには、submitValue:falseを設定します(これはすべてのフィールドタイプで機能します)。

hiddenName コンボの基になる値と同期される基になる非表示フィールドの名前。

valueFieldname プロパティとともに送信する値を含む基になるフィールドの名前。

displayField 表示する値を含む基になるフィールドの名前。

セットアップでは、次の2つの値を送信する必要があります。

submitValue: true

  • valueFieldの値を持つDataType(*セットを防ぐためsubmitValue: false*)
  • displayFieldの値を持つDataTypeCde(削除を防ぐためhiddenName

編集に基づくコメント

...この結果をコントローラーに送信します...

コントローラーに送信するとはどういう意味ですか?あなたの問題は珍しいように聞こえます、そして私はあなたがそれを間違った方法でやっていると思います...'ショッピング'はあなたの店の名前フィールドの値であり、SDはIdフィールドの値ですか?

編集

コンボボックスデータをロードせずに、コンボボックスに表示する表示値を設定する方法はありますか?

基本的にはそうではありません...表示される値プロパティを設定できますが、その場合はコミットされます。

ただし、表示値の代わりにコード値をポストバックします。

いいえ。コード値はありません。基本的に、フィールドの値となるvalueFieldが1つあります。

以下では、コンボストアに次の値がロードされていると仮定します{"id":"SP","Name":"Shopping"}

このフィールドはネイティブHTMLフィールドのように動作します。つまり、値を受け取るときに名前値があります。これで、hiddenName(この場合はDataType)を名前と一緒に使用すると、このフィールドを設定してServiceを表示することができます。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ます。あなたの場合、これによりルックアップが失敗する可能性があります。idPropertyストアリーダー内を次のように設定することをお勧めしますidProperty: 'Id'

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

于 2012-09-19T06:57:22.873 に答える