- - PR -
Responseオブジェクトの使用について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-20 18:42
複数のユーザコントロールから使える共通のクラスを作成しようと考えています。
そのクラス内でファイルを出力するリンクボタンを表示したいので、Responseオブジェクトを使用したいのですが、実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とエラーが発生してしまいます。 ResponseオブジェクトをWebフォームやユーザコントロール以外のクラスから使用することはできないのでしょうか。また、この方法に限らなくても良いのですが、実現方法があれば教えてください。 (以下、コードです) // ユーザコントロール public class WebUserControl1 : Class1 { private void Page_Load(object sender, System.EventArgs e) { Class1 class1 = new Class1(); Controls.Add(class1.GetControl()); } // Web フォーム デザイナで生成されたコード } // ファイル出力クラス public class Class1 : System.Web.UI.UserControl { public Class1() { } public System.Web.UI.Control GetControl() { System.Web.UI.WebControls.LinkButton LinkButton1 = new System.Web.UI.WebControls.LinkButton(); LinkButton1.Text = "リンク"; LinkButton1.Click += new System.EventHandler(this.LinkButton1_Click); System.Web.UI.Control control = new System.Web.UI.Control(); control.Controls.Add(LinkButton1); return control; } private void LinkButton1_Click(object sender, System.EventArgs e) { Response.Write("成功"); // ここでファイルを出力したい } } | ||||||||||||
|
投稿日時: 2005-09-20 18:56
ResponseはPageクラスのインスタンスプロパティなので
他のクラスから使用する場合はHttpContextクラスの静的プロパティからアクセスします。 HttpContext.Current.Response | ||||||||||||
|
投稿日時: 2005-09-20 18:59
こんにちわ。
何かえらくめちゃくちゃになってますね。 一体何故そういう構造にしたいのでしょうか。 それは置いといて。 具体的には、どこのインスタンスが設定されていませんか? あと >ResponseオブジェクトをWebフォームやユーザコントロール以外のクラスから使用することはできないのでしょうか。 の意図がよくわかりません。具体的にはどうしたいのでしょうか。 とりあえず、答えは「出来ます」。 | ||||||||||||
|
投稿日時: 2005-09-20 19:53
たまたま Response が参照できていませんが、問題はそこじゃないですね。
Page とか UserControl は、勝手に作ってはいけません。ASP.NET が作成します。 | ||||||||||||
|
投稿日時: 2005-09-20 19:54
共通のクラスで、何をさせようとしているのでしょう?
そのクラスは、本当に必要なのでしょうか?インターフェイスを定義して、別々に実装する方が、変更に強くないでしょうか? _________________ | ||||||||||||
|
投稿日時: 2005-09-20 20:42
burton999さんの言うとおり、「HttpContext.Current.Response」に修正したところ、問題なく動作するようになりました。ありがとうございました。
このような構造になった経緯ですが、現在、複数のコンテンツからなるいくつかのWebページを作成しようとしています。 コンテンツの内容がいくつかの種類に分類できたので、その分類ごとにユーザコントロールを作って実現することにしました。すると、複数のユーザコントロールに共通の動作(今回のようなファイルダウンロード)があることが分かったので、共通のクラスとして抽出することにしました。実際にはファイルのダウンロードの前後にも共通処理が入ります。 確かに、インターフェイスのみ定義するほうが変更に対応できるようになるかもしれませんが・・・。 | ||||||||||||
|
投稿日時: 2005-09-20 21:57
問題は解決しているので蛇足になりますが。とりあえずいくつか。
Class1 というのが、くろさんの仰る共通クラスでしょうか。それで WebUserControl1 がその共通クラスを利用するクライアントですよね。 何故、WebUserControl1 は Class1 を継承しているのに、Page_Load() で、別の Class1 をインスタンス化し、GetControl() を呼び出しているのでしょうか。 GetControl() 内の、LinkButtonは、さらに GetControl()内で生成されたコントロールに追加されていますが、これは何なのでしょうか。 共通にしたい要素は、振る舞い(この場合はファイル出力)ですか?コントロール(この場合はリンクボタン?)ですか?それとも両方ですか? 最初の私のレスで「意図がわからない」と言ったのは、提示されているコードでは、どこでも、Response オブジェクトを取得できると思ったからです。(全て UserControlに見える。自分で勝手にインスタンス化しているからおかしい) 何が、だめだったのでしょうか。 ファイル出力、リンクボタンのセットを共通化したいなら、それをユーザーコントロールにして、クライアントコントロールはそれを貼るだけではだめなのですか? # 頓珍漢なことを言っていたら、申し訳ありません。 [ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-20 21:59 ] [ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-21 00:06 ] | ||||||||||||
|
投稿日時: 2005-09-21 00:02
さらに蛇足^^;
私が何故わざわざ上記の事を言ったのかと言うと、
これでは、全然解決になっていないと思ったからです。 構造がどうとか、何か変だとかは置いておいて、普段何も気にしないで使っている Response オブジェクトが 何故 null だったのか。
ではなく、「何故 インスタンスがないのか」を疑問に持ってください。 にしざきさんが仰っているように、キーとなるのは、
です。 もう少し突っ込んでみてください。 |