You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET嵌套用户控件开发求助:如何使NavBar控件内的NavButton子控件正常生效

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:43:11