この質問は以前に尋ねられました
- Web フォーム :: VS 2008 でのカスタム テンプレート ユーザー コントロールのデザイン タイム サポート
- VS 2008 UserControl で ITemplate を使用すると、設計時のレンダリング エラーが発生する
- 設計時に Web ユーザー コントロールのコントロールを表示する方法
- UserControl ITemplate プロパティの設計時エラー - 専門家にとっては簡単...
しかし、もう一度尋ねても問題ありません。
UserControl
ASP.netにテンプレートを追加するにはどうすればよいですか?
これまでうまくいかなかったこと
新しい
UserControl
5から始めます。これを と呼びますContoso
:public partial class Contoso: System.Web.UI.UserControl { }
これにより、新しいコントロールを使用できるようになります: 1
<Contoso> Stuff in here <Contoso>
タイプのパブリック
ContentTemplate
プロパティを作成しITemplate
ます。public partial class Contoso: System.Web.UI.UserControl { public ITemplate ContentTemplate { get; set; } }
不確定な数の属性をプロパティに追加し
ContentTemplate
ます: 2//[ParseChildren(true)] [ParseChildren(true, "ContentTemplate")] //[ParseChildren(false)] public partial class Contoso: System.Web.UI.UserControl { [TemplateContainer(typeof(ContentContainer))] [TemplateInstance(TemplateInstance.Single)] [PersistenceMode(PersistenceMode.InnerProperty)] //[PersistenceMode(PersistenceMode.InnerDefaultProperty)] [Browsable(true)] //[Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] //[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ITemplate ContentTemplate { get; set; } }
<ContentTemplate>
これにより、aspx ファイルのコントロールに次のように追加できます: 1<Contoso> <ContentTemplate> Stuff in here </ContentTemplate> </Contoso>
次に、どこかに追加して、実際に使用する必要があります。
ContentTemplate
これを行うには、UserControl の内部div
要素の 1 つに追加します。.aspx
最初は空だったファイルから始めます。<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>
div
私たちのものを保持する親を追加しますContentTemplate
:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %> <div id="ContentDiv" runat="server"></div>
次に、コントロールのInit
ContentTemplate
中にその親に内容を詰め込みます。div
public partial class Contoso: System.Web.UI.UserControl { protected override void OnInit(EventArgs e) { base.OnInit(e); //If there's content, then put it into our ContentDiv div if (this.ContentTemplate != null) this.ContentTemplate.InstantiateIn(ContentDiv); } [PersistenceModeAttribute(PersistenceMode.InnerProperty)] [TemplateInstanceAttribute(TemplateInstance.Single)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ITemplate ContentTemplate { get; set; } }
編集:クラスが実装することを示します
INamingContainer
:public partial class Contoso: System.Web.UI.UserControl: INamingContainer { protected override void OnInit(EventArgs e) { base.OnInit(e); //If there's content, then put it into our ContentDiv div if (this.ContentTemplate != null) this.ContentTemplate.InstantiateIn(ContentDiv); } [PersistenceModeAttribute(PersistenceMode.InnerProperty)] [TemplateInstanceAttribute(TemplateInstance.Single)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ITemplate ContentTemplate { get; set; } }
INamingContainer
インターフェイスにはメンバーがなく、クラスを何かとしてマークするためにのみ使用されますUserControl
。これで完了です3。このコントロールを aspx ページで使用できるようになりました。ただし、最初にaspx ページの上部で「登録」する必要があります。
<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %>
どこ:
Contoso.ascx
ascx
ファイルの名前ですContoso
このユーザー コントロールを参照するために使用する要素の名前です。uc
前に置く必要があるテキストですuc:Contoso
(私はuser-control のuc
略として使用します)
コントロールをページに追加します。
<uc:Contoso ID="Crackers" runat="server"> <ContentTemplate> Stuff goes here </ContentTemplate> </qwerty:Contoso>
これで完了です。4
編集:上記が機能しない理由を追加するのを忘れました。Visual Studio に次のエラーが表示されます。
コントロール作成エラー - クラッカー
タイプ 'System.Web.UI.UserControl' には 'ContentTemplate' という名前のパブリック プロパティがありません
UserControl
という名前のパブリック プロパティがないため、これは理にかなってContentTemplate
います。
シリーズ
この質問は、進行中の Stackoverflow シリーズ「ユーザー コントロールのテンプレート化」の 1 つです。
- テンプレートを UserControl に追加する方法は?
- UserControl ではなく Control から継承する方法は?
- UserControl には IsPostBack がありますが、Control にはありません
- UserControl には、ContentTemplate という名前のパブリック プロパティがありません
- web.config から CodeFileBaseClass を指定するにはどうすればよいですか?
ボーナスリーディング
- 方法: テンプレート化された ASP.NET ユーザー コントロールを作成する
- ASP.Net 2.0 でテンプレート化されたユーザー コントロールを作成する
- ASP.NET のテンプレート化されたユーザー コントロールによる保守性の向上
脚注
- 1その構文は使用できません。読みやすく、理解しやすいフォームです。
- 2どの属性を追加すればよいのか、またその理由は誰にもわかりません。味に多かれ少なかれ属性を追加します。
- 3行われていません。UserControl は完了しましたが、私たちの作業ではありません。
- 4完了していません。うまくいきません。
- 5 Web サイト (Web アプリケーションではなく、別のアセンブリではありません)