如何在ASP.Net中向HTML标记容器标记添加属性/属性

时间:2011-06-14 12:43:49

标签: asp.net user-controls tags

我已经看过所有常见页面,其中包含有关如何创建允许用户控件内容(使用ITemplate和INamingContainer)的子标记的信息,但我还没有看到任何人能够添加属性成为属性对所述标签,例如:

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

如果你在Content标签上看到ContentAttribute,那就是我希望能够实现的,但是如果我使用ITemplate和INamingContainer等设置它,我可以添加一个实际上出现的属性该标签的Intellisense,但是当我运行代码时,它表示Content没有名为ContentAttribute的属性/属性(它也与VS IDE中的警告相同,但仍允许我编译它)。

我已经尝试了一切来完成这项工作,到目前为止唯一的方法似乎是如果我在MyControl上创建一个继承自System.Web.UI.Control并实现ITemplate的类。这很有效,但不幸的是我必须在Content标签上指定runat属性(因为它将其视为控件而不是子标签),如果可能的话我宁愿不这样做。

希望我已经解释得很好,如果我还没有请让我知道,我会尽力详细说明。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为你所建议的是类似于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>