Как добавить свойства / атрибуты в тег контейнера разметки HTML в ASP.Net - PullRequest
0 голосов
/ 14 июня 2011

Я видел все обычные страницы с информацией о том, как создать вложенный тег, который позволяет контенту в пользовательском элементе управления (используя ITemplate и INamingContainer), но я еще не видел никого, кто мог бы добавить свойства, которые становятся атрибутами к указанным тегам, например:

<asp:MyControl runat="server" ID="myControlTest" SomeAttribute="SomeValue">
    <Content ContentAttribute="Something">
        <a href="SomePage.aspx" alt="Blah">Blah</a>
    </Content>
</asp:MyControl>

Если вы видите ContentAttribute в теге Content, это то, чего я хотел бы достичь, но если я настрою все это с помощью ITemplate, INamingContainer и т. Д., Я могу добавить свойство, которое фактически отображается в Intellisense для этого тега, но когда я запускаю код, он говорит, что у Content нет свойства / атрибута с именем ContentAttribute (он также выдает то же самое, что и предупреждение в VS IDE, но все же позволяет мне его скомпилировать).

Я перепробовал все, чтобы это работало, и пока что единственный способ, по-видимому, состоит в том, чтобы сделать свойство Content в MyControl классом, который наследуется от System.Web.UI.Control и реализует ITemplate. Это работает, но, к сожалению, я должен указать атрибут runat в теге Content (потому что он видит его как элемент управления, а не как вложенный тег), и я бы предпочел этого не делать, если это возможно.

Надеюсь, я объяснил это достаточно хорошо, если я этого не сделаю, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы уточнить.

Заранее спасибо.

1 Ответ

1 голос
/ 14 июня 2011

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

Стандартные элементы управления .NET, насколько я могу судить, не реализуют этот способ.Подумайте о повторителе, который имеет:

<asp:Repeater id="myRepeater" runat="server">
  <HeaderTemplate>...</HeaderTemplate>
  <ItemTemplate>...</ItemTemplate>
  <FooterTemplate>...</FooterTemplate>
</asp:Repeater>

Каждый из подэлементов (шаблонов) имеет свое имя, а не то же имя с отдельным атрибутом.

Есть ли у вас какой-нибудь способ заранее определить, какими могут быть все возможные секции, как это делает ретранслятор?

<asp:MyControl runat="server" ID="myCtlTest">                            
  <SomethingTemplate><a href="SomePage.aspx" alt="Blah">Blah</a></SomethingTemplate>
  <OtherTemplate><a href="OtherPage.aspx" alt="Blah">Blah</a></OtherTemplate>
</asp:MyControl> 

Полагаю, нет, но хотел выкинуть это на всякий случай.

Альтернативно, может ли ContentAttribute перейти на MyControl?Затем SETter загрузит / соберет шаблон для вас в зависимости от значения.

<asp:MyControl runat="server" ID="myCtlTest" ContentAttribute="Something">
  <Template></Template>                        
</asp:MyControl> 

... или его можно загрузить методом вместо использования свойства SETter.

Если вам всегда понадобятся несколько шаблонов, возможно, комбинация этих двух понятий поможет.

<asp:MyControl runat="server" ID="myControlTest" 
               SomethingTemplate="Something"
               OtherTemplate="Other">
  <SomethingTemplate></SomethingTemplate>                        
  <OtherTemplate></OtherTemplate>                        
</asp:MyControl> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...