我的目标是能够在子页面中为元素定义一个类。在我的母版页上,我有以下内容:
<body class="<myown:AttributePlaceHolder runat="server" ID="BodyCssClass"/>">
AttributePlaceHolder
派生自ContentPlaceHolder
,只是从内容中删除任何换行符和额外空格。将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">
修改
正如约翰所指出的,以下也有效:
<body class='<myown:AttributePlaceHolder runat="server" ID="BodyCssClass"/>'>
将双引号更改为单引号。
但是我的html也会出现单引号。叫我疯了,但这只会伤害我......
我想这与ASP.NET解析引擎有关,在这种情况下我们应该把它称为bug还是“功能”?
答案 0 :(得分:1)
尝试这样的事情:
<body class='<asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat="server">ms-areaseparator</asp:ContentPlaceHolder>' ... >
答案 1 :(得分:1)
您还可以通过反转引号设置,在不使用服务器标签的情况下在输出中实现双引号:
<body class="<myown:AttributePlaceHolder runat='server' ID='BodyCssClass'/>">
占位符的runat和ID属性是单引号。至于为什么服务器标签使原始代码工作,只有解析引擎内的恶魔知道......
答案 2 :(得分:0)
你有没有想过这个?
在您的aspx页面中,已将body标记设置为服务器对象
<body runat="server" id="HtmlBody">
然后在您的代码中,您可以设置您喜欢的任何属性
HtmlBody.Attributes.Add("class", "your-css-class-name");
产生以下标记
<body id="ctl00_HtmlBody" class="your-css-class-name">