Я искал сайт, и я не могу найти решение для своей проблемы, поэтому приношу извинения, если на это уже был дан ответ (я уверен, что кто-то, должно быть, спросил об этом раньше).Как включить дополнительную разметку в внутреннее свойство 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>
К сожалению, я не знаю, какой тип мое содержание собственности должно быть. Мне в основном нужно реплицировать UpdatePanel
ContentTemplate
.
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. Я буду принимать ответ Брайана, когда он упомянул об исцелении перед кем-то еще.
Я обновил мой вопрос, но я не понимаю, как получить содержимое в сделайте там. – GenericTypeTea
ОК, в идеале, для этого лучше подходит сценарий пользовательского контроля, но вы можете попробовать переопределить рендер и записать его здесь ... ITemplate требует, чтобы вы делали запись. –
Я не думаю, что вы понимаете. Я хочу создать элементы управления в html, как и любой другой элемент управления. Я обновил вопрос о том, что я до сих пор видел. – GenericTypeTea