- - PR -
Webフォームの継承について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-11-20 19:28
ASP.NETで開発をしています。
通常System.Web.UI.Pageを継承してWebページが作成されますが、 他のWebフォームを継承してページが作れないかなと思い ---- '継承元Webフォーム Public Class BasePage Inherits System.Web.UI.Page ---- '継承先Webフォーム Public Class InheritsPage Inherits BasePage ---- としてみましたが、デザイナ上でWebフォームのアイテムが置けなくなり、どうやらHTMLページとして動いているみたいになりました。 Webフォームは必ずsuperクラスがSystem.Web.UI.Pageで無ければならないのでしょうか? | ||||
|
投稿日時: 2003-11-21 11:05
.aspxファイルの先頭辺りを見てもらうとわかりますが、.aspxファイルも、.aspx.vbファイルの先頭に定義されたクラスを継承しているんですねぇ。。。その辺をきちんと定義してあげると、いいと思いますよ。
| ||||
|
投稿日時: 2003-11-22 02:45
kaguraさん、こんばんは。
出来ないことはありませんが、いろいろ大変なので、他フォームの継承はやめておいた方が良いと思います。 何と言っても、Webフォームデザイナが継承元で宣言されているコントロールを認識できない点が一番のネックです。 画面構成とかロジックとかを再利用したいのなら、フォームの継承ではなく、ユーザーコントロール(カスタムコントロールではありません)の使用をおすすめします。 [ メッセージ編集済み 編集者: きくちゃん 編集日時 2003-11-22 07:18 ] | ||||
|
投稿日時: 2003-11-25 10:53
返信送れて申し訳ありません。
>Jittaさん 継承元Webフォーム.aspx @Pageディレクティブにて<@Page Inherits="BasePage"> 継承先Webフォーム.aspx @Pageディレクティブにて<@Page Inherits="InheritsPage"> としていますので、問題ないと思ったのですが・・・ >きくちゃんさん 継承元では、コントロールを置かずに独自メソッド(ViewSate関係)を追加して その機能を継承にて引き継ごうと思っているのでデザイナ上のコントロールを参照できないのは とりあえず問題ではなかったりします。 ユーザコントロールでViewSate関連は作ってあるのですが、継承が使用できればそっちのほうがスマートかなと思った次第です。 | ||||
|
投稿日時: 2003-11-25 12:43
スマートではないかもしれませんが、ロジックのみの継承でいいのであれば、
僕の場合、 ***.aspx.vb以外に 基本クラスとして PageBoundalyAbstract.vb を作成し、 各ページ毎にPageBoundalyAbstract継承した***Boundaly.vb を作成し、 ***.aspx.vbに持たせることで、 ロジックの共有を行っています。 また、 プロジェクトメンバー単位でのコーディングのばらつき防止、 コーディングの道筋の明示、 といった副作用も期待して、 ****.aspx.vbにはイベントをバウンダリクラスに渡す以外の ロジックを書かなくてもいいようにしています。 #本当はVS.NETでWebフォームの継承をしても問題なく利用できれば一番良かったんですけれど・・・。 | ||||
|
投稿日時: 2003-11-25 13:45
naruhiroさんのレスを見て…「ロジックの継承」しかできないですね!!コントロールはビハインドコードとaspxの両方に置かれるので、aspxの方でaspxを継承できないと、「見た目」は継承できないですね。 PreRenderイベントハンドラで、コントロールのスタイルをいちいち指定してやれば「見た目」も継承できそうな気がしますが、、、いまいち。 ちなみに私は、ascxにして、ページ上にドラッグしています。。。継承というより、使い回し、ですけど。 | ||||
|
投稿日時: 2003-11-25 13:55
>Jittaさん
僕もUIとロジックを合わせての再利用に関してはascxを作って、ドラッグ&ドロップで使いまわししてます。 他のページで必要になった時も貼るだけで済むのですごく楽だなーと実感してます。 | ||||
|
投稿日時: 2003-11-26 10:07
原因が判明しました。
例ではBasePageとなっている継承元でnewをオーバーライドしているのですが、 そこでContextを利用していてそこでNull参照していました。 なので、コンストラクタに If Context Is Nothing Then Exit Sub End If If Context.Items Is Nothing Then Exit Sub End If のコードを追加し、ビルド後デザイナ画面を開くと無事Webフォームとして動作しました。 ビルド後でないと駄目っぽいです。 #失念してしましたが、どこかのWebでもそのような図解で継承が説明去れていたような |
1