在Web表单上从数据库动态添加控件到字段

时间:2011-12-14 04:50:11

标签: asp.net sql dynamic webforms

所以标题有点令人困惑。我会尝试尽可能地清除它。

我正在使用开源购物车(nopCommerce)。我已经决定将这个构建到一个购物车中,我可以一遍又一遍地旋转,而无需更改后面的代码或前端代码。我希望一切都来自数据库和CSS文件。所以我需要创建一个控制标题菜单的数据库字段。

我想从数据库中动态添加一串HTML到页面上。很容易。我得到了照顾。问题是:在所有这些代码的中间,我需要添加一个用户控件。所以我所做的就是在HTML字符串中创建一个div(在服务器上运行)。

我在Page_PreInit

中附加了HTML字符串
    protected void Page_Init(object sender, EventArgs e)
    {
        headermenu.InnerHtml = GetLocaleResourceString("Header.InnerHTML");
    }

然后我尝试在Page_Load中动态创建用户控件。从headerMenu的InnerHTML中找到DIV并将其插入那里。

    protected void Page_Load(object sender, EventArgs e)
    {    
        Control navControl = LoadControl("~/Modules/CategoryNavigationFooter.ascx");
        var divControl = this.Page.FindControl("divCategoryContainer");

        divControl.Controls.Add(navControl);
    }

每次寻找该控件时。它找不到它并返回null。这是来自数据库的代码:

<ul class="topmenu sf-menu sf-js-enabled sf-shadow" id="nav-menu">
    <li>
        <a href="~/" runat="server" id="menuHomeLink">Home</a>
    </li>
    <li>
        <a href="~/AboutUs.aspx" runat="server" id="menuAboutUsLink">About Us</a>
            <ul id="ourstory">
                <li><a href="~/Staff.aspx" runat="server" id="menuStaffLink">Meet the Staff</a></li>
            </ul>
    </li>
    <li>
        <a href="~/Blog.aspx" id="menuBlogLink" runat="server">Blog</a>
            <ul id="blog">
                <li><a href="~/Blog.aspx?tag=favorite-posts" id="menuBlogFavorite">Favorite Posts</a></li>
            </ul>
    </li>
    <li>
        <a href="~/Store.aspx" runat="server" id="menuStoreLink">Store</a>
        <div id="divCategoryContainer" runat="Server"></div>
    </li>
    <li>
        <a href="~/Gallery.aspx" runat="server" id="menuGalleryLink">Gallery</a>
                <ul id="gallery">
                    <li><a href="~/Pictures.aspx" runat="server" id="menuPictures">Pictures</a></li>
                    <li><a href="~/Videos.aspx" runat="server" id="menuVideos">Videos</a></li>
                </ul>
    </li>
    <li>
        <a href="~/NewsArchive.aspx" id="menuNewsLink" runat="server">News</a>
    </li>
    <li>
        <a href="~/ContactUs.aspx" id="menuContactLink" runat="server">Contact Us</a>
    </li>
</ul>

任何帮助都会受到赞赏。我已经度过了最后一天,不能浪费任何时间。

2 个答案:

答案 0 :(得分:1)

如果你想使用动态控制我建议你使用面板控件,在page_init你可以使用panle.controls.add(new litralcontrol(“html”);在那里插入任何div或asp控件。希望它帮助

答案 1 :(得分:1)

您无法对html文字字符串执行FindControlFindControl仅适用于页面控制树 - headerMenu控件将位于控件树中。但是,您设置为该控件的内容的任何html都不会成为控件树的一部分 - 控件将html视为字符串,并将其发送到页面输出中(因此您的runat="server"也将被显示在html输出)。

解决方案是在你的html中添加一些占位符字符串,然后用实际的div控件替换它。例如,

var html = GetLocaleResourceString("Header.InnerHTML");
// look for our placeholder
var parts = html.split(new string[] { "#MY_DIV_PLACEHOLDER#" });
headerMenu.Controls.Add(new LiteralControl() { Text = parts[0] });
headerMenu.Controls.Add(new Placeholder() { ID="divCategoryContainer" });
headerMenu.Controls.Add(new LiteralControl() { Text = parts[1] });