by WebSurfer
2013年6月20日 13:15
先の記事「リソース埋め込みカスタムコントロール」で、画像、html ファイル、スクリプトファイル、css ファイルなどのリソースをアセンブリに埋め込んだカスタムコントロールの作り方を説明しました。
このようなリソース埋め込みカスタムコントロールを継承したコントロールを作って使う場合の注意点を書きます。
アセンブリに埋め込んだリソースは、GetWebResourceUrl メソッド によって URL 参照を取得して使用しますが、注意すべきはこのメソッドの第一引数 type(リソースの型)です。
先の記事の MsButton.cs のコードでは this.GetType() でリソースの型を取得していますが、このコントロールを継承した場合 this は継承先になり、ASP.NET は継承先からリソースを探すので、リソースが見つからないという結果になります。
この問題を解決するには this.GetType() に代えて typeof 演算子を利用します。先の記事の MsButton.cs のコードでは以下のようにします。
protected override void CreateChildControls()
{
ClientScriptManager cs = Page.ClientScript;
// このコントロールを継承する場合 this.GetType() ではダメ
// this は継承先になり、結果、リソースが見つからない。
//Type rsType = this.GetType();
Type rsType = typeof(MsButton);
// css への参照を <head></head> に配置
HtmlLink css = new HtmlLink();
css.Href =
cs.GetWebResourceUrl(rsType, "SimpleControl.MyStylesheet.css");
// ・・・中略・・・
}
上に紹介した MSDN ライブラリのサンプルコードでも typeof 演算子を使っていますね。