私は BackboneJS を使用しています。oData 対応の WebAPI からデータを取得するコレクションを持っています。データを取得する際に、oData $filter を使用していくつかの追加パラメーターを渡します。
次のようになります。
collection.fetch({
data: $.param({ '$filter': 'Filter1 eq ' + filter.get('filter1') +
' and Filter2 eq ' + filter.get('filter2') }),
//some more stuff...
})
私は基本的にウィザードを実行し、途中でこのフィルター モデルを構築しています。このフィルター モデルから得られるすべての値は、文字列値または空の文字列のいずれかです。フィルター モデルの get メソッドをオーバーライドして、適切な値を確実に取得できるようにしました。空でない場合は文字列値を一重引用符で囲み、空の場合は「null」という単語を含む文字列値を返します。
var Filter = Backbone.Model.extend({
get: function (attributes, options) {
var value = Backbone.Model.prototype.get.call(this, attributes, options);
if (value == '') return 'null';
else return "'" + value + "'";
}
});
私のモデルが次のようになっているとします。
{filter1: 'filter1', filter2: 'filter2'}
Chrome と Firefox でコレクションをフェッチすると、生成されるリクエストは次のようになります。
replacedapiurl?%24filter=Filter1+eq+%27filter1%27+and+Filter2+eq+%27filter2%27
これはまったく問題なく、Firefox と Chrome の両方でうまく機能します。私が抱えている問題は、IE10 ではこれが機能しないことです。何らかの理由で、生成されるリクエストは次のようになります。
replacedapiurl?%24filter=Filter1+eq+'+filter1+'+and+Filter1+eq+'+filter1+'
IE9 モードに設定すると、同じことが行われます。IE8 モードに設定すると、突然動作し始めます。
EncodeURI()、EncodeURIComponent()、escape() を使用して、オーバーライドされた get メソッド内と $.param ビット内の両方で、一重引用符の前に「\」を追加してみました。しかし、何も機能しません。「\」を追加しても何も起こらず、すべてのエンコーディングは、追加された「+」記号を次のようにエンコードするだけです。
replacedapiurl?%24filter=Filter1+eq+'%2520filter1%2520'+and+Filter1+eq+'%2520filter1%2520'
これも私が求めているものではありません。
なぜこれが起こっているのか誰にも分かりますか?この動作で IE ブラウザのバージョンに違いがあるのはなぜですか? どうすれば修正できますか?一重引用符を '%27' に変換する必要があります。できればブラウザ固有のコードを記述する必要はありません。
編集: 誰かに IE9 でチェックしてもらいましたが、それは正常に動作するため、動作しないのは IE10 を使用している場合 (および IE10 を IE9 モードで使用している場合) だけです。