ASP.NET嵌套用户控件开发求助:如何使NavBar控件内的NavButton子控件正常生效
嘿,我看了你当前的代码实现,问题其实出在几个关键的属性配置和小细节上,咱们一步步调整就能让嵌套的NavButton子控件正常工作啦!
核心修改点
调整
ParseChildren与PersistChildren属性
你当前给NavBar类标记的[ParseChildren(true),PersistChildren(true)]会让ASP.NET混淆内部元素的处理逻辑。应该将PersistChildren设为false,这样框架才会把<NavButtons>节点下的子元素解析到对应的集合属性中,而不是直接当作HTML输出。给
NavButton类添加专属标记
给NavButton加上[ToolboxItem(false)],明确它是一个嵌套子控件,不需要出现在Visual Studio的工具箱中,避免不必要的干扰。规范代码格式
你的NavButtons属性getter里的return语句有换行问题,虽然不影响编译,但调整成连贯代码会更清晰。
修改后的完整代码
1. NavBar 用户控件前端代码(.ascx)
<div id="select" class="row"> <ul class="nav nav-pills nav-justified"> <asp:Literal ID="ltlNavButtons" runat="server" /> </ul> </div>
2. NavBar 后台逻辑代码(.ascx.cs)
[ParseChildren(true), PersistChildren(false), ToolboxData("<{0}:NavBar runat=server></{0}:NavBar>")] public partial class NavBar : System.Web.UI.UserControl, INamingContainer { private NavButtonCollection _navButtons; [PersistenceMode(PersistenceMode.InnerDefaultProperty)] public NavButtonCollection NavButtons { get { if (_navButtons == null) _navButtons = new NavButtonCollection(); return _navButtons; } } protected void Page_Load(object sender, EventArgs e) { foreach (NavButton nb in NavButtons) { ltlNavButtons.Text += nb.ToString() + Environment.NewLine; } } } public class NavButtonCollection : List<NavButton> { } [ToolboxItem(false)] public class NavButton { public string Target { get; set; } public NavButton() { Target = string.Empty; } public override string ToString() { return $@"<li role='presentation'> <a id='a{Target}' data-toggle='div{Target}' class='btn btn-default'> <b>{Target}</b> </a> </li>"; } }
为什么这样修改?
当设置PersistChildren(false)后,ASP.NET会自动识别PersistenceMode.InnerDefaultProperty标记的NavButtons属性,将<NavButtons>节点内的所有<abc:NavButton>实例化后添加到集合中。这样你在Page_Load里遍历集合时,就能拿到所有在ASPX中定义的子按钮,进而生成对应的HTML。
现在你再用你原本的ASPX代码调用控件:
<abc:NavBar ID="nvbTest" runat="server"> <NavButtons> <abc:NavButton Target="Target1" /> <abc:NavButton Target="Target2" /> <abc:NavButton Target="Target3" /> </NavButtons> </abc:NavBar>
运行页面后,就能看到生成的Bootstrap导航按钮啦!
备注:内容来源于stack exchange,提问作者James Carr

