gpt4 book ai didi

c# - ASP.NET : Possible to create a UserControl that include inside markup content?

转载 作者:行者123 更新时间:2023-11-30 16:36:45 25 4
gpt4 key购买 nike

我正在努力实现谷歌无法给出答案的东西。我正在尝试创建一个 asp.net 用户控件,当我将内容放入它的打开关闭标记时,它将包含它,以便我仍然能够通过父级的 ID 访问它的内容。这是我想要实现的示例。

用户控制:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ctrlGENE_CollapsiblePanel.ascx.cs"
Inherits="Controls_GenericsControls_ctrlGENE_CollapsiblePanel" %>
<asp:Panel ID="pnlHeader" CssClass="SnapPanelHeader" runat="server">
<h3>
<asp:Literal ID="litTitle" Text='<%# Text %>' runat="server" />
</h3>
<div class="SnapPanelHeader-img">
<img id="imgOpenClose" src="/images/application/close.jpg" alt="" />
</div>
</asp:Panel>
<asp:PlaceHolder runat="server" ID="pnlContent">
// **HERE I WANT TO INCLUDE THE INSIDE MARKUP**
</asp:PlaceHolder>
<act:CollapsiblePanelExtender runat="server" TargetControlID="pnlContent" ImageControlID="imgOpenClose"
ExpandControlID="imgOpenClose" CollapseControlID="imgOpenClose" CollapsedImage="/images/application/open.jpg"
ExpandedImage="/images/application/close.jpg" CollapsedSize="0" TextLabelID="litTitle">
</act:CollapsiblePanelExtender>

包含控件的父页面:

<uc:MyUserControl ID="clpTest" runat="server">
<asp:Literal ID="litText" runat="server" />
</uc:MyUserControl>

像这样我可以在 Parent.cs 文件中做:

litText.Text = "Anything";

我知道我们可以使用 ITemplate 接口(interface)实现类似的功能,如下所示:http://msdn.microsoft.com/en-us/library/36574bf6.aspx

看起来像这样:

<uc:MyUserControl ID="clpTest" runat="server">
<ItemTemplate>
<asp:Literal ID="litText" runat="server" />
</ItemTemplate>
</uc:MyUserControl>

但如果我这样做,我将无法访问 litText 的属性,而我可以访问它的唯一方法是使用 FindControl,我想避免这种情况。

如果我能以某种方式实现我的目标,有人对此有提示吗?

谢谢

最佳答案

好的,我在这里修复了它,这是我使用的解决方案:

在 MyUserConstrol.ascx 文件中,我在想要显示 innerHTML 的地方放了一个占位符:

<asp:PlaceHolder runat="server" ID="plhContent" />

然后在 MyUserControl.ascx.cs 文件中,我将这些属性添加到类中:

[ParseChildren(false)]
[PersistChildren(true)]

我在文件中添加了这个:

public void RegisterUpdatePanel(UpdatePanel panel)
{
MethodInfo m =
(from methods in typeof (ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
where methods.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")
select methods).First();

m.Invoke(ScriptManager.GetCurrent(Page), new object[] {panel});
}

protected override void CreateChildControls()
{
for (int i = 0; i < Controls.Count; i++)
if (Controls[i] is MyLastControl)
while (i + 2 < Controls.Count)
{
// In cas there is an updatepanel in the control we are moving
// We are registering an event to register the updatepanel
// to the scriptmanager again
SearchUpdatePanel(Controls[i + 2]);
plhContent.Controls.Add(Controls[i + 2]);
}
base.CreateChildControls();
}

private void SearchUpdatePanel(Control control)
{
if (control is UpdatePanel)
control.Unload += updPnl_Unload;

foreach (Control childcontrol in control.Controls)
SearchUpdatePanel(childcontrol);
}

protected void updPnl_Unload(object sender, EventArgs e)
{
RegisterUpdatePanel((UpdatePanel) sender);
}

请注意,我在 ascx 文件中将我的最后一个控件命名为 myLastContol 以了解 innerHTML 注入(inject)之前的控件是什么,因为我不知道我收到的是什么。该过程基本上是在 UserControl 的控件中循环,当您到达 UserControl 的末尾时,之后的所有内容都是来自父级的 innerHTML,因此将它们移动到我想要的占位符处。

我希望这会对某人有所帮助。

以下是我用来实现目标的一些资源: Registering UpdatePanel

关于c# - ASP.NET : Possible to create a UserControl that include inside markup content?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com