C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: 実行時のASP.NETの各ページのクラス名について


(過去ログ 112 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■66511 / inTopicNo.1)  実行時のASP.NETの各ページのクラス名について
  
□投稿者/ るぷ犬 (1回)-(2013/04/30(Tue) 16:15:01)

分類:[ASP.NET (VB)] 

【開発環境】
VS 2010
VB.NET 2010
ASP.NET 4.0


【質問内容】
ASP.NET上で作成したpageのクラス名って、ディレクトリ名とファイル名を
アンダーバーでつないだ形(pages_contents_aspx)となるみたいなのですが、
自分で作成したベースクラス(BasePage.vb)があり、各ページ(ex. pages/contents.aspx)に対して、
それを継承しています。
また、そのベースクラスに任意のプロパティー(ex. ActionMode)も用意しています。


マスターページでMe.Pageを使用して、コンテンツページ(?)の親クラスである、
ベースクラスでDirectCastをして、そのベースクラスで用意しているプロパティー(ex. ActionMode)を
参照しようとしているのですが、私はpageのクラス名(contents)がコードビハインドのクラス名かと
思いきや、上記のようなクラス名になるので、DirectCastができません。

この場合、どのようにすれば、よろしいのでしょうか?




引用返信 編集キー/
■66516 / inTopicNo.2)  Re[1]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ もりお (2回)-(2013/05/01(Wed) 00:50:19)
No66511 (るぷ犬 さん) に返信

aspxページがBasePageを継承しているなら、コンテンツページをBasePageにキャストするのは
これでいけるんじゃないかと思います。

Dim p As BasePage = DirectCast(Me.Page, BasePage)


コンテンツページをコードビハインドにキャストしてBasePageのプロパティを参照するには
コードビハインドがBasePageを継承するようにして、
aspxページがコードビハインドを継承するようにすれば、
こんな感じでできるんでないかと思います。

Dim p As contents = DirectCast(Me.Page, contents)
引用返信 編集キー/
■66520 / inTopicNo.3)  Re[2]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ るぷ犬 (2回)-(2013/05/01(Wed) 10:59:51)
No66516 (もりお さん) に返信
> ■No66511 (るぷ犬 さん) に返信
>
> aspxページがBasePageを継承しているなら、コンテンツページをBasePageにキャストするのは
> これでいけるんじゃないかと思います。
>
> Dim p As BasePage = DirectCast(Me.Page, BasePage)


お返事ありがとうございます。

私も、最初はこれだと思ってやってたんですが。。。
インテリセンスでちゃんと、出てきますし、じゃあ、実行もちゃんとできるだろうと。

ですが、実行時にブレイクで止めて、クイックウオッチでみると、
「型 〜が定義されていません。」
と出てしまいます。

ちなみに、UI.Pageにすると、ちゃんと、DirectCastができました。

その違いはDirectCastをする対象(Me.Page)に該当のクラスが継承されていないというところのようです。


> aspxページがBasePageを継承しているなら

気になったのですが、個々のやり方っていうのは。
aspxページ(contents.aspx)のコードビハインド(contents.aspx.vb)で、
BasePageを継承すればよろしいのですよね?

aspxページ(contents.aspx)の方には何も書かなくていい(継承の類)のですよね?


引用返信 編集キー/
■66522 / inTopicNo.4)  Re[3]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ もりお (3回)-(2013/05/01(Wed) 15:07:17)
2013/05/01(Wed) 15:12:14 編集(投稿者)

No66520 (るぷ犬 さん) に返信

> aspxページ(contents.aspx)の方には何も書かなくていい(継承の類)のですよね?

コードビハインドがBasePageを継承して、
aspxページがそのコードビハインドを継承する必要があります。

aspxページがコードビハインドを継承する、というのは
aspxページのPageディレクティブのInherits属性にコードビハインドが指定されるということです。
こんな感じです。
<%@ Page …… CodeBehind="contents.aspx.vb" Inherits="WebApplication1.contents" %>

aspxページがすでにコードビハインドを継承するようになっていれば特別書く必要はありません。
aspxページがコードビハインドを継承するようになっていなければ、PageディレクティブのInherits属性に
コードビハインドを指定することでaspxページがコードビハインドを継承するようにする必要があります。
引用返信 編集キー/
■66523 / inTopicNo.5)  Re[4]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ るぷ犬 (3回)-(2013/05/01(Wed) 15:58:39)
No66522 (もりお さん) に返信
> 2013/05/01(Wed) 15:12:14 編集(投稿者)
>
> ■No66520 (るぷ犬 さん) に返信
>
>>aspxページ(contents.aspx)の方には何も書かなくていい(継承の類)のですよね?
>
> コードビハインドがBasePageを継承して、
> aspxページがそのコードビハインドを継承する必要があります。
>
> aspxページがコードビハインドを継承する、というのは
> aspxページのPageディレクティブのInherits属性にコードビハインドが指定されるということです。
> こんな感じです。
> <%@ Page …… CodeBehind="contents.aspx.vb" Inherits="WebApplication1.contents" %>
>
> aspxページがすでにコードビハインドを継承するようになっていれば特別書く必要はありません。
> aspxページがコードビハインドを継承するようになっていなければ、PageディレクティブのInherits属性に
> コードビハインドを指定することでaspxページがコードビハインドを継承するようにする必要があります。


確認したところ、上記に書かれてあることは設定していました。
・aspxページのPageディレクティブのInherits属性


いわば、Inherits属性に書いてあるWebApplication1.contentsはBasePageを継承しているって
事だと思っています。

それでも、DirectCastができないという状態です。

引用返信 編集キー/
■66530 / inTopicNo.6)  Re[5]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ もりお (4回)-(2013/05/01(Wed) 22:47:32)
No66523 (るぷ犬 さん) に返信

あら。そうするとなんでしょうね。あとは名前空間やクラス名が違っているくらいしか
思いつきません。コードはどのように書かれていて、なんという例外が投げられますか?
例外のメッセージはなんと出力されますか?
引用返信 編集キー/
■66542 / inTopicNo.7)  Re[6]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ るぷ犬 (4回)-(2013/05/03(Fri) 16:50:20)
No66530 (もりお さん) に返信
> ■No66523 (るぷ犬 さん) に返信
>
> あら。そうするとなんでしょうね。あとは名前空間やクラス名が違っているくらいしか
> 思いつきません。コードはどのように書かれていて、なんという例外が投げられますか?
> 例外のメッセージはなんと出力されますか?

まずいところは、xで伏せていますが、
エラーは下記のように出ています。

型 'ASP.pages_xx_xxxxxx_aspx' のオブジェクトを型 'xxxxx.Common.Page.PageImplement.BasePage' にキャストできません。


そして、コーディングは次のようにしています。

If DirectCast(Me.Page, Page.PageImplement.BasePage).CurrentPageMode = Global.yyyyy.Common.Page.PageImplement.BasePage.PageMode.Reference Then


> あとは名前空間やクラス名が違っているくらいしか
> 思いつきません。

これって、インテリセンスで出てきますし、ビルドも通っているんですよね。
で、実際実行した時にはダイレクトキャストが失敗して、nothingになっていると。

>型 'ASP.pages_xx_xxxxxx_aspx'
これって、コードビハインドのクラスも含めた形の実行時の型なんですよね?
ちゃんと、コードビハインドのクラスには、

Public Class xxxxxPage
Inherits BasePage

と、しています。
引用返信 編集キー/
■66545 / inTopicNo.8)  Re[7]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ WebSurfer (23回)-(2013/05/04(Sat) 01:01:51)
最後のところしか見てないので違ったらスミマセン。

No66542 (るぷ犬 さん) に返信
> そして、コーディングは次のようにしています。
>
> If DirectCast(Me.Page, Page.PageImplement.BasePage).CurrentPageMode = Global.yyyyy.Common.Page.PageImplement.BasePage.PageMode.Reference Then

DirectCast の 2 つ目の引数は変換後の型を指定するはずですが、Page.PageImplement.BasePage は型になるのでしょうか? (Page は aspx ページオブジェクトへの参照になりませんか?)

引用返信 編集キー/
■66546 / inTopicNo.9)  Re[7]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ もりお (5回)-(2013/05/04(Sat) 01:40:13)
No66542 (るぷ犬 さん) に返信

>>型 'ASP.pages_xx_xxxxxx_aspx'
>これって、コードビハインドのクラスも含めた形の実行時の型なんですよね?

はい、当該クラスはaspxファイルのPageディレクティブのInherits属性に指定されたクラスを
継承するように生成されるものです。Inherits属性にはコードビハインドが指定されている
とのことなので、コードビハインドを継承するはずです。

自動的に生成されるクラスが存在するディレクトリは次のコードで知ることができます。
Debug.Print(System.IO.Path.GetDirectoryName(Me.GetType().Assembly.Location))

例外のメッセージから考えるとやはり継承がされてないのでないかと思います。
コードビハインドクラスのInheritsをGlobal名前空間から指定してみてはいかがでしょうか。

コードビハインドへのキャストは成功しますか?もし失敗するようであれば、
aspxファイルのInherits属性を見直す必要があります。
引用返信 編集キー/
■66659 / inTopicNo.10)  Re[8]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ るぷ犬 (5回)-(2013/05/13(Mon) 17:44:19)
すみません。遅くなりました。(仕事が炎上していました。。。)


Me.Page.GetType().BaseType().BaseType().Name

で、ベースページの型は取れました。が、ページによってはいくつ、継承しているか、
不定なのです。

BaseTypeでどんどんまわして、チェックしたいクラス名にぶち当たるまで
チェックしないといけないのでしょうか?
(そういう共通関数を作っておくとか?)

ただし、それは、指定のクラスを継承しているかどうかっていうことがわかるだけで、
なぜ、DirectCastが失敗するのか、わかりません。

> Dim p As BasePage = DirectCast(Me.Page, BasePage)

こんな感じで、やっているのですが。。。

ひとつ、気になったのは、どうやら、指定したBasePageが
認識されていないようなのです。
というのも、DirectCastが失敗しているエラーの内容が、

DirectCast(Me.Page, Page.PageImplement.BasePage) 型 'Page.PageImplement.BasePage' が定義されていません。

と、クイックウオッチで見ると、出てしまいます。


引用返信 編集キー/
■66664 / inTopicNo.11)  Re[9]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ もりお (8回)-(2013/05/14(Tue) 03:52:06)
No66659 (るぷ犬 さん) に返信
> BaseTypeでどんどんまわして、チェックしたいクラス名にぶち当たるまで
> チェックしないといけないのでしょうか?
> (そういう共通関数を作っておくとか?)

あるページがBasePageを継承しているかを実行時に知りたいときは、ということです
か?あるページがBasePageを継承しているかはTypeOf演算子を使うことで判別するこ
とができます。こんな感じです。

If TypeOf Me.Page Is BasePage Then
	Dim p As BasePage = DirectCast(Me.Page, BasePage)
	・・・
End If


> DirectCastが失敗しているエラーの内容が、
>
> DirectCast(Me.Page, Page.PageImplement.BasePage) 型 'Page.PageImplement.
> BasePage'が定義されていません。
>
> と、クイックウオッチで見ると、出てしまいます。

型が定義されてないときはコンパイル時にエラーになるはずなんです。ビルドは通っ
ているということなので、クイックウオッチの問題なのでないかと思います。プロパ
ティ名と名前空間が被っているので、それが原因でデバッガが型の追跡に失敗してる
のでないかと思います。

実行時に例外が投げられて実行が停止して、その例外のメッセージに型が定義されて
いませんという文言が含まれているというのであればちょっと話が変わってきますが、
クイックウオッチで見たときだけそのメッセージが表示されるというのであれば、あ
まり気にする必要もないのかなとそのように思います。名前空間をGlobalから記述す
れば解決するのでないかと思います。

引用返信 編集キー/
■66669 / inTopicNo.12)  Re[10]: 実行時のASP.NETの各ページのクラス名について
□投稿者/ るぷ犬 (6回)-(2013/05/14(Tue) 11:34:53)
No66664 (もりお さん) に返信
> あるページがBasePageを継承しているかを実行時に知りたいときは、ということです
> か?あるページがBasePageを継承しているかはTypeOf演算子を使うことで判別するこ
> とができます。こんな感じです。
>
> If TypeOf Me.Page Is BasePage Then
> Dim p As BasePage = DirectCast(Me.Page, BasePage)
> ・・・
> End If

なるほど、これで奥深くの継承元になっているクラスを調べることができるんですね。


> 名前空間をGlobalから記述すれば解決するのでないかと思います。

どんぴしゃでした。
DirectCast時の第2引数をGlobalから記述したら、ちゃんと、変換できていました。
(クイックウオッチもOKでした。)


これで、私の要望かなうことができましたので、
解決済みにしたいと思います。

もりおさん、長らくおつきあい下さいまして、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -