- PR -

Responseオブジェクトの使用について

投稿者投稿内容
くろ
会議室デビュー日: 2005/03/01
投稿数: 13
投稿日時: 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("成功"); // ここでファイルを出力したい
}
}
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-09-20 18:56
ResponseはPageクラスのインスタンスプロパティなので
他のクラスから使用する場合はHttpContextクラスの静的プロパティからアクセスします。

HttpContext.Current.Response
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-20 18:59
こんにちわ。

何かえらくめちゃくちゃになってますね。
一体何故そういう構造にしたいのでしょうか。

それは置いといて。
具体的には、どこのインスタンスが設定されていませんか?
あと

>ResponseオブジェクトをWebフォームやユーザコントロール以外のクラスから使用することはできないのでしょうか。

の意図がよくわかりません。具体的にはどうしたいのでしょうか。
とりあえず、答えは「出来ます」。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-20 19:53
たまたま Response が参照できていませんが、問題はそこじゃないですね。
Page とか UserControl は、勝手に作ってはいけません。ASP.NET が作成します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-09-20 19:54
 共通のクラスで、何をさせようとしているのでしょう?

 そのクラスは、本当に必要なのでしょうか?インターフェイスを定義して、別々に実装する方が、変更に強くないでしょうか?
_________________
くろ
会議室デビュー日: 2005/03/01
投稿数: 13
投稿日時: 2005-09-20 20:42
burton999さんの言うとおり、「HttpContext.Current.Response」に修正したところ、問題なく動作するようになりました。ありがとうございました。

このような構造になった経緯ですが、現在、複数のコンテンツからなるいくつかのWebページを作成しようとしています。
コンテンツの内容がいくつかの種類に分類できたので、その分類ごとにユーザコントロールを作って実現することにしました。すると、複数のユーザコントロールに共通の動作(今回のようなファイルダウンロード)があることが分かったので、共通のクラスとして抽出することにしました。実際にはファイルのダウンロードの前後にも共通処理が入ります。

確かに、インターフェイスのみ定義するほうが変更に対応できるようになるかもしれませんが・・・。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 2005-09-21 00:02
さらに蛇足^^;

私が何故わざわざ上記の事を言ったのかと言うと、
引用:

「HttpContext.Current.Response」に修正したところ、問題なく動作するようになりました。ありがとうございました。


これでは、全然解決になっていないと思ったからです。

構造がどうとか、何か変だとかは置いておいて、普段何も気にしないで使っている Response オブジェクトが 何故 null だったのか。

引用:

ResponseオブジェクトをWebフォームやユーザコントロール以外のクラスから使用することはできないのでしょうか



ではなく、「何故 インスタンスがないのか」を疑問に持ってください。

にしざきさんが仰っているように、キーとなるのは、
引用:

Page とか UserControl は、勝手に作ってはいけません。ASP.NET が作成します。


です。

もう少し突っ込んでみてください。

スキルアップ/キャリアアップ(JOB@IT)