2014-09-03 37 views
2

这个问题可能已经被问到,但我找不到任何引用它,所以我道歉,如果它看起来像一个重复的问题。带有HTML内容占位符的ASP.NET Generic UserControl

我想要做的是创建一个通用的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 %>" /> 

任何帮助表示赞赏。

回答

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(); 
} 

它的工作原理只是精细。

0

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

现在您可以在此容器中添加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); 
    } 
} 
+0

重写'Render()'的问题是页面上还有其他控件,我不想强​​制手动进行渲染。使用'List '确实有效,只是设计师对此抱怨。虽然谢谢! – PoweredByOrange 2014-09-03 21:24:37