【问题标题】:asp:label doesn't render childrenasp:label 不呈现子级
【发布时间】:2013-06-07 16:27:31
【问题描述】:

我有一个带有嵌套自定义控件的asp:label,它根本不呈现。我尝试为Label 类型注册一个自定义WebControlAdapter,在调试时我注意到Controls 集合中显然没有控制,它似乎完全忽略了任何嵌套元素。

这里是标记

<asp:Label ID="lbl13" runat="server" AssociatedControlID="txt13" Text="<%$ Resources:Resources, lbl13 %>">
    <asp:ValidationMessage ID="vm13" runat="server" MessageFor="txt13" CssClass="field-validation-error"></asp:ValidationMessage>
</asp:Label>

知道如何绕过这个问题吗?

【问题讨论】:

  • asp:ValidationMessage移出asp:Label控件。
  • 如果我想让它真正嵌套在标签标签中怎么办。
  • ValidationMessage 控制是否在Label 控制之外工作?在Label 控件中放置控件的原因是什么?
  • @Win 确实有效。我只希望验证消息跨度位于同一个标签标记中。
  • 您从哪里获得asp:ValidationMessage 控制权?是自定义服务器控件吗?

标签: asp.net .net webforms web-controls


【解决方案1】:

当您设置Text 属性时,它会清除子控件。如果您从Label 中删除Text="&lt;%$ Resources:Resources, lbl13 %&gt;",您的子控件应该呈现。


编辑
如果将Text 属性设置为静态字符串并仅添加文字内容,则标签将仅呈现文字内容:

<asp:Label runat="server" Text="Hello"> World</asp:Label>
Output: World

如果将Text 属性设置为静态字符串并添加子控件,标签将呈现文本和子控件:

<asp:Label runat="server" Text="Hello">
   <asp:Label runat="server" Text="World" />
</asp:Label>
Output: HelloWorld

如果您使用表达式构建器设置Text 属性,则标签将仅呈现文本:

<asp:Label runat="server" Text="<%$ Resources:Resources,Hello %>">
   <asp:Label runat="server" Text="World" />
</asp:Label>
Output: Localised version of "Hello"

要覆盖此行为,您需要自定义 Label 控件。例如:

public class MyLabel : Label
{
   public override string Text
   {
      get { return base.Text; }
      set
      {
         if (HasControls())
         {
            Controls.AddAt(0, new LiteralControl(value));
         }
         else
         {
            base.Text = value;
         }
      }
   }
}

【讨论】:

  • 这不是真的。文本将在控件之前呈现。
  • @Win:是的。 Labels Text 属性上的设置器以:if (HasControls()) Controls.Clear() 开头
  • @Win:只有在添加控件之前设置文本时才有效。
  • 真的很好。有没有办法覆盖这种行为,而不用嵌套文字替换所有这些 Text 属性
  • @Burnzy:你或许可以不使用tagMapping 配置元素,但这会将所有Label 元素映射到你的自定义Label 控件。
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多