从用户控件内添加页面控件集合

Zar*_*ani 5 vb.net asp.net user-controls jquery-ui-dialog

我有一个asp.net usercontrol,它代表一个"弹出"对话框.基本上,它是jQuery UI对话框的包装器,可以将其子类化以轻松创建对话框.

作为此控件的一部分,我需要将一个div注入到控件所使用的页面中,或者在窗体的顶部或底部,以便在弹出实例化时,将其父级更改为此div.这允许"嵌套"弹出窗口,而子弹出窗口中没有子弹出窗口.

麻烦的是,我找不到一种安全的方法将这个div注入页面.用户控件没有preinit事件,所以我不能在那里执行,并且在Init,Load或PreRender中调用Page.Form.Controls.Add(...)会导致标准异常"控件集合无法修改在DataBind,Init,Load,PreRender或Unload阶段."

我以为我找到了一个解决方案......

ScriptManager.RegisterClientScriptBlock(Page, Me.GetType, UniqueID + "_Dialog_Div", containerDiv, False)
Run Code Online (Sandbox Code Playgroud)

...这似乎也工作正常,但最近同事试图把一个UpdatePanel对话框内,现在她得到的错误"类型'ASP.controls_order_viewzips_ascx’和重点登记的脚本标签"ctl00 $ ContentBody $ OViewZips_Dialog_Div具有无效脚本标签之外的字符:.只能注册格式正确的脚本标签."

你应该如何从用户控件内部向页面控件集合中添加控件?

Tim*_*ter 7

我不确定为什么你真的需要将这个div添加到页面的表单中,但这应该有效:

  Public Class WebUserControl1
    Inherits System.Web.UI.UserControl

        Private Sub UC_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            AddHandler Me.Page.Init, AddressOf Me.Page_Init
        End Sub

        Private Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs)
            Dim dialogDiv As New Panel
            dialogDiv.ID = "DialogDiv"
            If Not Page.Form.Controls.Contains(dialogDiv) Then
                Page.Form.Controls.AddAt(0, dialogDiv)
            End If
        End Sub

    End Class
Run Code Online (Sandbox Code Playgroud)

如何在C#中实现它.我总是收到错误控件集合无法在Load,PreRender上修改我需要一个文字控件从用户控件添加到我的母版页头.文字控件将包含css链接.

是否要将文字添加到HeadContent主文件中的-ContentPlaceHolder控件或页面的标题(html头元素)?但是,我在这里展示了两者.

这是你的代码隐藏UserControl:

public partial class UC_AddToMaster : System.Web.UI.UserControl
{
    private void Page_Init(object sender, System.EventArgs e)
    {
        this.Page.Init += UC_AddToMaster_Init;
    }

    private void UC_AddToMaster_Init(object sender, EventArgs e)
    {
        Literal literal = new Literal{ Text = "Hi World!" };
        // if you want to add it to the header of the page:
        if (!Page.Header.Controls.Contains(literal))
        {
            Page.Header.Controls.AddAt(0, literal);
        }

        // if you want to add it to the master's HeadContent ContentPlaceHolder control:
        var siteMaster = Page.Master as SiteMaster;
        if (siteMaster != null)
        {
            if (!siteMaster.Head.Controls.Contains(literal))
            {
                siteMaster.Head.Controls.AddAt(0, literal);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于HeadContent上面提到的方法,我在主人中提供了以下属性:

// in the master
public ContentPlaceHolder Head { get { return this.HeadContent; } }
Run Code Online (Sandbox Code Playgroud)

因此我需要将页面的主人转换为它的实际类型(SiteMaster这里)UserControl.否则我无法访问此属性.

  • 有一个小但重要的区别.如果您处理"page"的init事件,则不直接处理页面的init事件.实际上,您正在处理usercontrol的init事件,并且在页面本身之前触发了该事件.因此,您希望更改尚未完全初始化的页面的控件集合.通过添加事件处理程序,您可以确保在页面初始化之后和page_load之前直接添加div.以下是一些有趣的细节:http://msdn.microsoft.com/en-us/library/ms178472.aspx#additional_page_life_cycle_considerations很高兴我能提供帮助. (2认同)