プログラムによる機能の評価
更新 : 2007 年 11 月
ASP.NET モバイル コントロールの場合、Web.config ファイルの <deviceFilters> セクションで提供される機能には、MobileCapabilities クラスの HasCapability メソッドを使用してプログラムによってアクセスできます。このメソッドを呼び出すと、比較メソッドの評価を実行できます。
HasCapability メソッドは、現在のデバイスが Web.config で宣言されているデバイス フィルタに適合しているかどうかをプログラムで判断するときに便利です。MobileCapabilities インスタンスは HasCapability メソッドの評価結果をキャッシュに保存します。これによって、後続する同一の機能名と省略可能な引数が要求された場合に、再評価せずに済むようになります。HasCapability メソッドが役に立つのは、<DeviceSpecific> 要素にある多くの選択項目の中から、ASP.NET ページ フレームワークが選択するものに一致するコードを書く場合です。
メモ : |
---|
HasCapability メソッドでは、ページ上に定義されているメソッドを呼び出す <DeviceSpecific> 要素はサポートしていません。 |
HasCapability メソッドには、2 つの引数 (capabilityName と optionalArgument) があります。capabilityName は、機能ディクショナリに登録されているデバイス評価メソッド、プロパティ、または項目の名前です。optionalArgument は、capabilityName 引数が要求する引数です。HasCapability メソッドは、次の順序で評価を実行します。
capabilityName の値が Web.config ファイル内で指定されているデバイス フィルタ名と一致するかどうかをチェックします。
メモ : HasCapability メソッドの optionalArgument 引数を null に設定すると、<DeviceSpecific> 構成要素と <Choice> 構成要素の評価が行われます。
手順 1. の結果が true であり、デリゲート エバリュエータ型のフィルタ (カスタム メソッドを使って指定データを評価するフィルタ) が指定されると、HasCapability メソッドは optionalArgument パラメータの引数を使用してデリゲートを起動し、結果を返します。
手順 1. の結果が true であり、比較エバリュエータ型のフィルタ (機能名と指定した値を比較するフィルタ) が指定されると、HasCapability メソッドは、エバリュエータにある機能名と引数を使用して自身を呼び出し (元の optionalArgument パラメータは無視されます)、結果を返します。
MobileCapabilities オブジェクトが capabilityName という名前のプロパティを持つ場合、HasCapability メソッドはこのプロパティを文字列にキャストし、その文字列と optionalArgument の値が等しい場合に true を返します。ブール型の比較処理では大文字と小文字が区別されません。その他の比較処理では区別されます。したがって、"true" と "True" は等しいと判断されますが、"left" と "Left" は等しくないと判断されます。
capabilityName プロパティが存在しない場合、HasCapability メソッドは MobileCapabilities オブジェクトに関連付けられた機能ディクショナリ内でこのプロパティを検索します。capabilityName プロパティが見つかった場合、HasCapability メソッドは optionalArgument パラメータと比較して結果を返します。ディクショナリに格納されているデータは文字列であるため、キャストは不要です。
これらのテストに失敗した場合、HasCapability メソッドは ArgumentOutOfRangeException 例外をスローします。
例
次の例は、HasCapability メソッドを呼び出す方法を示しています。GPSEnabled と ScreenBitDepth は、Items コレクションに定義されたフィルタ、プロパティ、値のいずれかになります。
((MobileCapabilities)Request.Browser).HasCapability("GPSEnabled", null);
代わりに、次の方法でメソッドを呼び出すこともできます。
((MobileCapabilities)Request.Browser).HasCapability("ScreenBitDepth", "8");