代码之家  ›  专栏  ›  技术社区  ›  Gideon

我应该能够理解这个ContentPlaceholder行为吗?

  •  1
  • Gideon  · 技术社区  · 15 年前

    我的目标是能够为子页面中的元素定义一个类。在我的母版页上,我有以下内容:

    <body class="<myown:AttributePlaceHolder runat="server" ID="BodyCssClass"/>">
    

    这个 AttributePlaceHolder 来源于 ContentPlaceHolder 从内容中删除所有换行符和多余的空格。我将描述的问题也会在更改 属性占位符 变成正常 内容占位符 .

    现在,上述代码段不起作用,最终会出现以下错误:

    找不到ContentPlaceholder 母版页中的“bodycssclass” '/views/shared/site.master',验证 内容控件的ContentPlaceHolderID 内容页中的属性

    将上述代码行更改为:

    <body class="<% %><myown:AttributePlaceHolder runat="server" ID="BodyCssClass"/>">
    

    它确实有效(注意 <% %> )

    这是个骗局,只是想知道我是否错过了什么。

    为了获得更多信息,我可以在我的孩子页面上写:

    <asp:Content ContentPlaceHolderID="BodyCssClass" runat="server">profile-edit someotherclass another-class</asp:Content>
    

    甚至:

        <asp:Content ContentPlaceHolderID="BodyCssClass" runat="server">profile-edit
    someotherclass
    
    another-class
    </asp:Content>
    

    它将很好地打印成:

    <body class="profile-edit someotherclass another-class">
    

    编辑
    正如Johan所指出的,以下内容也有效:

    <body class='<myown:AttributePlaceHolder runat="server" ID="BodyCssClass"/>'>
    

    将双引号改为单引号。

    但我的HTML也会以单引号出现。叫我疯子,但那只会伤害我…

    我想这和ASP.NET解析引擎有关,在这种情况下,我们应该称它为bug还是“特性”?

    3 回复  |  直到 15 年前
        1
  •  1
  •   TSmith    15 年前

    您还可以通过反转Quotes设置来实现输出中的双引号,而无需使用服务器标记:

    <body class="<myown:AttributePlaceHolder runat='server' ID='BodyCssClass'/>">

    占位符的runat和id属性是单引号的。至于为什么服务器标签使原始代码工作,只有解析引擎中的恶魔知道…

        2
  •  1
  •   Johan Leino    15 年前

    尝试如下操作:

    <body class='<asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat="server">ms-areaseparator</asp:ContentPlaceHolder>' ... >
    
        3
  •  0
  •   Kane    15 年前

    你想过这个吗?

    在ASPX页中,已将body标记设置为服务器对象

    <body runat="server" id="HtmlBody">
    

    然后在您的代码后面,您可以设置任何您喜欢的属性。

    HtmlBody.Attributes.Add("class", "your-css-class-name");
    

    生成以下标记

    <body id="ctl00_HtmlBody" class="your-css-class-name">
    
    推荐文章