这个问题可能已经被问过了,但我找不到任何引用,所以如果它看起来像是一个重复的问题我会道歉。
我要做的是创建一个通用的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 %>" />
感谢任何帮助。
答案 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);
}
}