2010-04-30 6 views
4

Я искал сайт, и я не могу найти решение для своей проблемы, поэтому приношу извинения, если на это уже был дан ответ (я уверен, что кто-то, должно быть, спросил об этом раньше).Как включить дополнительную разметку в внутреннее свойство Content для ASP.Net WebControl?

Я написал окно всплывающего окна jQuery, которое я упаковал как WebControl и IScriptControl. Последний шаг - уметь писать разметку в тегах моего элемента управления. Я использовал атрибут InnerProperty несколько раз, но только для включения списков строго типизированных классов.

Вот моя собственность на WebControl:

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public something??? Content 
{ 
    get 
    { 
     if (_content == null) 
     { 
     _content = new something???(); 
     } 
     return _content; 
    } 
} 
private something??? _content; 

Вот HTML Markup о том, что я после:

<ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px" 
     Modal="true" WindowCaption="Test Window" CssClass="window"> 
     <Content> 
     <div style="display:none;"> 
      <asp:Button runat="server" ID="Button1" OnClick="Button1_Click" /> 
     </div> 
     <%--Etc--%> 
     <%--Etc--%> 
     </Content> 
    </ctr:WebPopup> 

К сожалению, я не знаю, какой тип мое содержание собственности должно быть. Мне в основном нужно реплицировать UpdatePanelContentTemplate.

EDIT: Таким образом, можно автоматически создать контейнер Template, но никаких элементов управления не видно, что случилось с тем, что я делаю?

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public ITemplate Content 
{ 
    get 
    { 
     return _content; 
    } 
    set 
    { 
     _content = value; 
    } 
} 
private ITemplate _content; 

EDIT2: Переопределение CreateChildControls позволяет управление в пределах ITemplate быть вынесено:

protected override void CreateChildControls() 
{ 
    if (this.Content != null) 
    { 
     this.Controls.Clear(); 
     this.Content.InstantiateIn(this); 
    } 
    base.CreateChildControls(); 
} 

К сожалению, я не могу теперь доступ к элементам управления в ITemplate из файла отделенного кода на файл. То есть если я поставить кнопку в моей марки, как так:

<ctr:WebPopup runat="server" ID="win_StatusFilter"> 
    <Content> 
     <asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" /> 
    </Content> 
</ctr:WebPopup> 

Я тогда не может получить доступ к btn_Test из кода позади:

protected void Page_Load(object sender, EventArgs e) 
{ 
    btn_Test.Text = "btn_Test is not present in Intellisense and 
     is not accessible to the page. It does, however, render correctly."; 
} 

EDIT3: FIXED! Редактировать 2 - это правильное решение. Это было просто Visual Studios 2010 - боль в ягодицах. Закрыл приложение и снова открыл его, и все мои элементы управления в свойстве Content были доступны на странице.

EDIT4: Редактировать 2 не удалось устранить проблему. Я уже пробовал атрибут [TemplateInstance(TemplateInstance.Single)], прежде чем кто-нибудь упомянул об этом, однако в то время я не думал, что это имело значение. Похоже, Visual Studios 2010 просто странно.

Поскольку я удалил тег, и он продолжал работать, я предположил, что атрибут не имел никакого значения. С возвратом к коду AGAIN элементы управления стали недоступны. Добавление атрибута обратно разрешило все это работать и чтобы элементы управления были доступны на стороне сервера. MADNESS. Я буду принимать ответ Брайана, когда он упомянул об исцелении перед кем-то еще.

ответ

5

общественного ITemplate Содержание

который затем вы предоставляете в UI, как:

Label label = new Label(); 
this.Content.InstantiateIn(label); 

//Render label 

EDIT: Убедитесь, что шаблон также определяет

[TemplateInstance(TemplateInstance.Single)] 

как это позволяет доступ к элементам управления в шаблоне напрямую.

+0

Я обновил мой вопрос, но я не понимаю, как получить содержимое в сделайте там. – GenericTypeTea

+0

ОК, в идеале, для этого лучше подходит сценарий пользовательского контроля, но вы можете попробовать переопределить рендер и записать его здесь ... ITemplate требует, чтобы вы делали запись. –

+0

Я не думаю, что вы понимаете. Я хочу создать элементы управления в html, как и любой другой элемент управления. Я обновил вопрос о том, что я до сих пор видел. – GenericTypeTea

1

Вы должны попытаться использовать это:

win_StatusFilter.FindControl("btn_Test") // this will be a Control 
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null. 

В противном случае вы должны определить некоторые свойства для элемента управления, как в этой статье: http://msdn.microsoft.com/ru-ru/library/36574bf6%28v=VS.90%29.aspx


Update: Согласно замечаниям в этом статья о свойстве ContentTemplate для UpdatePanel:

http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contenttemplate(v=VS.90).aspx

вы можете получить элементы управления из ContentTemplate из-за значения TemplateInstanceAttribute (UpdatePanel.ContentTemplate имеет значение TemplateInstance.Single).

Таким образом, вы должны использовать этот код:

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
[TemplateInstance(TemplateInstance.Single)] 
public ITemplate Content 

Дополнительная информация:

http://msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v=VS.90).aspx

+0

Нет. Я хочу, чтобы он работал как UpdatePanel. Я не хочу искать все, используя FindControl. Вся суть этого элемента управления Popup заключается в том, что он может быть повторно использован и что он просто инкапсулирует элементы управления, которые он будет содержать. Элементы управления должны быть доступны со страницы. – GenericTypeTea

+0

Тогда ваша проблема легко решить, я обновил свой ответ – VMAtm

+0

+1 Спасибо, я уже пробовал это (см. Мое последнее редактирование), но предположил, что это не изменило ситуацию. Я буду принимать ответ Брайана, хотя он первым попал туда. – GenericTypeTea

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

  • Нет связанных вопросов^_^