DOBON.NET DOBON.NETプログラミング掲示板過去ログ

別プロジェクトのWebユーザーコントロールを使用したい

環境/言語:[VB.NET 2010]
分類:[ASP.NET]

現在以下のような構成でWebシステムを開発(プロトタイプ)しております。

プロジェクトA
→メインプロジェクト(メニュー)
→仮想ディレクトリB、Cを作成する

プロジェクトB
→コンテンツプロジェクト(各ページ)

プロジェクトC
→継承コントロール等

今回、プロジェクトC内にWebユーザーコントロールを作成し、プロジェクトBの各コンテンツページに組み込もうと考えております。
可能でしょうか??

また、プロジェクトC.dllには、.ascxファイルも含まれるでしょうか?

ご教授お願いいたします。
■No28231に返信(PGさんの記事)

ここまで構成が決まっているなら試してみるのが一番かと思います。
ご返答ありがとうございます。

プロジェクトCに以下のクラスファイルを作成したところ、ツールボックスからコントロールを張り付けることができました。

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

<DefaultProperty("Text"), ToolboxData("<{0}:ExUserControl1 runat=server></{0}:ExUserControl1>")> _
Public Class ExUserControl1
Inherits System.Web.UI.Control

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
writer.Write("<div style='text-align:center;vertical-align:middle;'>")
writer.Write("<cc1:ExTextBox ID='ExTextBox1' runat='server' text='あああああ'></cc1:ExTextBox>")
writer.Write("</div>")
End Sub

End Class

※実行しても、テキストボックスが表示されません。

ExTextBoxは継承コントロールで、今回同じくプロジェクトCにあります。
今は仮にcc1とTagPrefixをしていしているのですが、この部分は実際どうコーディングするのが、正しいのでしょうか??
ノーマルのWebコントロールしか使えないのでしょうか?

そもそもこのやり方があっているのでしょうか?

ご教授お願いします。
■No28233に返信(PGさんの記事)

> 今は仮にcc1とTagPrefixをしていしているのですが、この部分は実際どうコーディングするのが、正しいのでしょうか??

aspxに貼り付けてみたら
ソースの上部に
<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<%@ Register src="WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc2" %>
こんな感じのが記述されていました。このtagprefixを使えばよいようです。
Render()を使用して行うのはカスタムコントロールのようですね。
この方法ですと、時間がかかりすぎてしまいそうです。

.ascxファイル(WEBユーザーコントロール)を使用したいのですが、他のプロジェクトからの使用はできないのでしょうか??
デザイナに張り付けるとエラー(参照設定していますが、存在しないと言われてしまいます)になってしまいます・・・
■No28236 に返信(PGさんの記事)

> また、プロジェクトC.dllには、.ascxファイルも含まれるでしょうか?

dll に ascx ファイル自体が含まれることはありません。
ascx はマークアップコードとプログラムコードで構成されるわけですが、プログラムコードのみ
がコンパイルされ dll に含まれます。マークアップコードは含まれません。

> ノーマルのWebコントロールしか使えないのでしょうか?

カスタムコントロールの Render メソッドで出力する場合にということでよいですか。
Render メソッドは HTML を出力するように実装する必要があります。
ASP.NET サーバーコントロールを直接出力することはできません。PG さんのいわれるノーマル
のWebコントロールというのが何を指すのかわかりませんでしたが、Render メソッドでは
HTML Element を出力することができます。

> そもそもこのやり方があっているのでしょうか?

別プロジェクトのユーザーコントロールを使用できないためカスタムコントロールを作成するとい
うのはあっていると思います。Render メソッドの実装は間違っています。

> .ascxファイル(WEBユーザーコントロール)を使用したいのですが、他のプロジェクトからの使
> 用はできないのでしょうか??

ページでユーザーコントロールを使用するときにアプリケーションルートを最上位とする ascx 
ファイルのパスを指定する必要があります。
<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
shu さんの記述を借用させていただいて Register ディレクティブの src 属性の部分です。
パスはプロジェクトを越えて指定することができません。パスを指定せずにユーザーコントロール
を使用する術があるとよいのですが、MSDN のユーザーコントロールのページとリンク先を全部
読んでみましたが、ありませんでした。別プロジェクトのユーザーコントロールを使用することは
できない可能性が高いと思います。

ASP.NET ユーザー コントロール
http://msdn.microsoft.com/ja-jp/library/y6wb1a0e.aspx
ご返答ありがとうございます。

自分も調べていますが、やはり無理な気がします・・・

一つ、今試していることがあります。

<%@ Register src="/アプリ名/Controls/WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>

上記のように直接、パスを指定する(ユーザーコントロールは別プロジェクトで作っています)方法です。
ユーザーコントロールを張り付けた後、srcを書き換えたところ、デザインにも反映されて正常に動作しました。

ですが、一つ問題があります。
パスの「アプリ名」の部分がIISの設定によって変わってしまいます。
なので、「アプリ名」の部分を動的にしたいのですが、可能でしょうか??
デザインにも反映されるようにしたいです。※←これができないと、この方法はなしになります。。。

ASP.NETルーティングを使うとできるのでしょうか??
■No28241に返信(PGさんの記事)

> <%@ Register src="/アプリ名/Controls/WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>

なるほど、こういう記述をしないといけないとなると使えても面倒ですね。
ユーザーコントロールは参照設定では使わない方がいいと言った方がいいかもです。
2011/02/26(Sat) 09:41:14 編集(投稿者)

■No28241 に返信(PGさんの記事)

> パスの「アプリ名」の部分がIISの設定によって変わってしまいます。
> なので、「アプリ名」の部分を動的にしたいのですが、可能でしょうか??

ユーザーコントロールを含むプロジェクトは IIS によって公開されているという
ことですか。アプリ名のところを動的にどうしたいのでしょうか。IIS の設定を取得
したいのですか、アプリ名のところを書き換えたいのですか。
IIS の設定を固定することはできないのでしょうか。

> ASP.NETルーティングを使うとできるのでしょうか??

ルーティングというのはクライアントから要求された URL を解決するもの
ですよね。サーバー側でのパスの解決にも使えるのですかね。どうなんでしょうね、
私も知りたいです。

■No28249 に返信(shuさんの記事)

> なるほど、こういう記述をしないといけないとなると使えても面倒ですね。
> ユーザーコントロールは参照設定では使わない方がいいと言った方がいいかもです。

面倒なことを回避する手がないという前提のもとではということですよね。
もしかすると、以下のようにプロジェクトを入れ子にして作成すると、
ユーザーコントロールをプロジェクトCからプロジェクトBのページにドラッグアンド
ドロップすることで認識されるかもしれません。

プロジェクトB
│  Page.aspx
└─プロジェクトC
      UserControl.ascx

DOBON.NET | プログラミング道 | プログラミング掲示板