2014-09-03 78 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