带有Html内容占位符的ASP.NET Generic UserControl

时间:2014-09-03 16:21:17

标签: c# jquery asp.net

这个问题可能已经被问过了,但我找不到任何引用,所以如果它看起来像是一个重复的问题我会道歉。

我要做的是创建一个通用的DialogBox作为ASP.NET UserControl;其中包含使用jQuery创建对话框所需的所有脚本。该对话框有一组固定的按钮,但我希​​望能够让用户在创建对话框时定义内容。假设这是用户控件的标记:

<head>
    <script type="text/javascript">
            // jQuery script to create the dialog
    </script>
</head>
<body>
    <div runat="server" id="divContainer">
        <!--Html Content Placeholder. What goes here?-->
    </div>
</body>

代码隐藏:

[ParseChildren(true, "Contents")]
public partial class UCDialogBox : ExtendedUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
          Page.DataBind();
    }

    public List<Control> Contents { get; set; }

    public DialogType Type { get; set; }

    public string Title { get; set; }
}

在注册控件后的实际页面上,我希望能够做到这样的事情:

<uc:DialogBox runat="server">
    <div>
        <label>Hello World</label>
    </div>
</uc:DialogBox>

问题是,List<Control>仅允许ASP.NET控件。普通的HTML控件(例如我上面提到的)不会起作用。

问题1:我应该使用哪种类型来允许任何HTML控件嵌套在用户控件中?我尝试了System.Web.UI.HtmlControls.HtmlControl,但这也没有用(ASP.NET说The element 'div' cannot be nested within the element 'dialogbox')。

问题2 我将用户控件上的HTML内容占位符放在什么位置?绑定到后面的代码上的Contents属性?像

这样的东西
<SomePlaceholderControl DataSource="<%# Contents %>" />

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

奇怪的是,将HTML控件放在用户控件的主体内不会导致运行时错误。事实上,控件碰巧就好了。我想这只是设计师抱怨它。

至于占位符,我没有必要使用任何特定控件;我只是使用HtmlTextWriter将控件呈现为格式良好的HTML字符串,该字符串在标记中被调用:

<div runat="server" id="divContainer">
    <%# RenderContents() %>
</div>

代码隐藏方法:

public string RenderContents()
{
    StringWriter writer = new StringWriter();
    HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);

    foreach (var control in Contents)
    {
        control.RenderControl(htmlWriter);
    }

    return writer.ToString();
}

它运作得很好。

答案 1 :(得分:0)

我不确定这是否是正确的方法,我在Dialog控件中添加了一个ITemplate,并放置了一个HtmlGenericControl容器,它是Div控件和runat =“server”。

现在您可以在此容器中添加html控件和文本。

<cc1:UCDialogBox  ID="dialog" runat="server">
    <HtmlPlaceHolder>
        <div runat="server">
            <h1>Title</h1>
            <h2>Description</h2>
            <div>Modal Content</div>
        </div>
    </HtmlPlaceHolder>
</cc1:UCDialogBox> 

在自定义服务器控件中,您可以将容器div内容作为innerHtml或innerText

获取
public class UCDialogBox : WebControl, INamingContainer
{
    private ITemplate htmlPlaceHolder = null;

    [
    Browsable(false),
    DefaultValue(null),
    Description("Add your html contorls"),
    PersistenceMode(PersistenceMode.InnerProperty)
    ]
    public virtual ITemplate HtmlPlaceHolder
    {
        get
        {
            return htmlPlaceHolder;
        }
        set
        {
            htmlPlaceHolder = value;
        }
    }

    protected override void Render(HtmlTextWriter output)
    {
        HtmlGenericControl placeholder = new HtmlGenericControl();

        htmlPlaceHolder.InstantiateIn(placeholder);

        var html = placeholder.Controls[1] as System.Web.UI.HtmlControls.HtmlGenericControl;

        var result = html.InnerHtml.Replace("\r", "").Replace("\n", "").Trim();

        output.Write(result);
    }
}