ASP.NET WebControlの「コンテンツ」内部プロパティ内に追加のマークアップを含めるにはどうすればよいですか?
-
02-10-2019 - |
質問
私はサイトを検索しましたが、私の問題の解決策を見つけることができないので、それがすでに答えられている場合は謝罪します(誰かがこれを以前に尋ねたに違いないと確信しています)。
私は、WebControlとiScriptControlとしてパッケージ化したjQueryポップアップウィンドウを書きました。最後のステップは、私のコントロールのタグ内にマークアップを書き込むことができることです。 innerproperty属性を数回使用しましたが、強く型付けされたクラスのリストを含めるためにのみ使用しました。
これがWebControlの私の財産です:
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public something??? Content
{
get
{
if (_content == null)
{
_content = new something???();
}
return _content;
}
}
private something??? _content;
これが私が後にしたもののHTMLマークアップです:
<ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px"
Modal="true" WindowCaption="Test Window" CssClass="window">
<Content>
<div style="display:none;">
<asp:Button runat="server" ID="Button1" OnClick="Button1_Click" />
</div>
<%--Etc--%>
<%--Etc--%>
</Content>
</ctr:WebPopup>
残念ながら、コンテンツプロパティがどのようなタイプであるべきかわかりません。基本的に複製する必要があります UpdatePanel
's ContentTemplate
.
編集: :したがって、次のことにより、テンプレートコンテナを自動的に作成できますが、コントロールが表示されない場合、私がしていることの何が問題になっていますか?
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
get
{
return _content;
}
set
{
_content = value;
}
}
private ITemplate _content;
編集2: :CreateChildControlsをオーバーライドすると、ItemPlate内のコントロールをレンダリングできます。
protected override void CreateChildControls()
{
if (this.Content != null)
{
this.Controls.Clear();
this.Content.InstantiateIn(this);
}
base.CreateChildControls();
}
残念ながら、ファイル上のcodebehindファイルからitemplate内のコントロールにアクセスすることはできません。つまり、マーク内にボタンを入れた場合:
<ctr:WebPopup runat="server" ID="win_StatusFilter">
<Content>
<asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" />
</Content>
</ctr:WebPopup>
その後、アクセスできません btn_Test
背後のコードから:
protected void Page_Load(object sender, EventArgs e)
{
btn_Test.Text = "btn_Test is not present in Intellisense and
is not accessible to the page. It does, however, render correctly.";
}
編集3: : 修繕!編集2は正しいソリオンです。それはただのビジュアルスタジオ2010年であり、お尻の痛みでした。アプリを閉じて再開し、コンテンツプロパティ内のすべてのコントロールがページにアクセスできました。
編集4: :編集2は問題を修正しませんでした。私はすでに試しました [TemplateInstance(TemplateInstance.Single)]
誰もがそれを言及する前に属性がありましたが、当時は違いが生まれたとは思いませんでした。 Visual Studios 2010は今日、奇妙だと思われます。
タグを削除して、それが機能し続けて以来、属性が違いを生んでいないと仮定しました。再びコードに戻って以来、コントロールは利用できなくなりました。属性を再び追加することで、すべてが機能し、コントロールがアクセス可能なサーバー側になりました。 狂気. 。ブライアンの答えは、他の誰かの前に修正について言及したので、私は受け入れます。
解決
パブリックアイテムプレートコンテンツ
次に、これをuiにレンダリングします。
Label label = new Label();
this.Content.InstantiateIn(label);
//Render label
編集:テンプレートも定義していることを確認してください
[TemplateInstance(TemplateInstance.Single)]
これにより、テンプレート内のコントロールに直接アクセスできるためです。
他のヒント
これを使用してみてください。
win_StatusFilter.FindControl("btn_Test") // this will be a Control
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null.
それ以外の場合は、この記事のように、制御用のプロパティを定義する必要があります。http://msdn.microsoft.com/ru-ru/library/36574bf6%28 = vs.90%29.aspx
更新:この記事のContentTemplateプロパティに関する備考によると、updatePanel:
http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contenttemplate(v=vs.90).aspx
TemplateInStanceAttribute値のためにContentTemplateからコントロールを取得できます(updatePanel.contentTemplateには TemplateInstance.Single
).
したがって、このコードのみを使用する必要があります。
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content
詳細:
http://msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v = vs.90).aspx