2014-09-03 5 views
2

Возможно, этот вопрос уже задан, но я не мог найти ссылки на него, поэтому я приношу свои извинения, если это похоже на дублирующий вопрос.ASP.NET Generic UserControl с Html Content Placeholder

Что я пытаюсь сделать, это создать общий DialogBox как пользовательский UserControl ASP.NET; который будет содержать весь скрипт, необходимый для создания диалога, используя 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

Я не уверен, что это правильный подход. Я добавил ITemplate внутри элемента управления Dialog и поместил контейнер 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); 
    } 
} 
+0

Проблема с переопределением 'Render()' заключается в том, что на странице есть другие элементы управления, которые я не хочу принудительно отображать вручную. Использование 'List ' действительно работало, это был просто дизайнер, который ныл о нем. Спасибо хоть! – PoweredByOrange

Смежные вопросы