Должен ли я понять это поведение 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, в таком случае мы должны называть это ошибкой или «функцией»?


person Gideon    schedule 11.06.2009    source источник
comment
Не могли бы вы просто изменить место, где стоят одинарные кавычки? ‹класс тела=‹content runat='сервер' /››   -  person Jesper Haug Karsrud    schedule 11.06.2009
comment
Это действительно должно работать. Это одна из тех вещей, которые вы делаете dohhh. Во всяком случае, все еще не объясняет поведение.   -  person Gideon    schedule 11.06.2009
comment
Нет, сразу толку особого нет, но если подумать; когда двойные кавычки внутри другой пары двойных кавычек когда-либо работали без экранирования или изменения их в кавычки? Так что в чем-то это имеет смысл, а в чем-то нет...   -  person Jesper Haug Karsrud    schedule 11.06.2009
comment
Но это объяснило бы поведение добавления к нему ‹%%›, чтобы заставить его работать...   -  person Gideon    schedule 12.06.2009


Ответы (3)


Вы также можете добиться двойных кавычек в выводе без использования серверных тегов, изменив настройку кавычек:

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

Атрибуты runat и ID заполнителя заключаются в одинарные кавычки. Что касается того, почему тег сервера заставляет исходный код работать, это знают только демоны внутри механизма синтаксического анализа...

person TSmith    schedule 20.10.2009

попробуйте что-то вроде этого:

<body class='<asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat="server">ms-areaseparator</asp:ContentPlaceHolder>' ... >
person Johan Leino    schedule 11.06.2009

Вы думали об этом?

На вашей странице aspx установите тег body как объект сервера.

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

Затем в вашем коде вы можете установить любые атрибуты, которые вам нравятся.

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

Что производит следующую разметку

<body id="ctl00_HtmlBody" class="your-css-class-name">
person Kane    schedule 11.06.2009
comment
Хотя я не указал это в тексте, я пометил его как MVC. Поэтому у меня нет кода, и я не хочу устанавливать имя класса в контроллере. Имя класса должно быть установлено в представлении. - person Gideon; 11.06.2009