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

时间:2009-06-11 07:46:15

标签: asp.net asp.net-mvc contentplaceholder

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

<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还是“功能”?

3 个答案:

答案 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">