Повторяющиеся теги заголовков с использованием ASP.NET MasterPage - PullRequest
5 голосов
/ 20 января 2010

Мне нужно динамически установить заголовок страницы, поэтому я использую код, подобный следующему:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="~/about.aspx.cs" Inherits="Default" %>
<%@ Register Assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="ajaxToolkit" %>
<%@ MasterType VirtualPath="MasterPage.master" %>
<%@ OutputCache Duration="43200" VaryByParam="*" Location="Server" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <title><%=pageTitle%></title>
</asp:Content>

Но это приводит к дублированию тегов заголовков. Есть ли способ, которым я могу обойти это? Спасибо.

РЕДАКТИРОВАТЬ: Исходя из приведенных ниже предложений, у меня теперь есть следующее в моей MasterPage:

<head id="Head1" runat="server">
<title>Default Title</title>
...
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head> 

и следующее на моей основной странице:

    this.Title="xxx";

но я не получаю никакого заголовка (ни «Заголовок по умолчанию», ни «xxx»).

РЕДАКТИРОВАТЬ: Неважно. Получил работу с использованием этого метода.

Ответы [ 8 ]

10 голосов
/ 08 августа 2011

Если второй тег заголовка был пуст и находится в конце тега head, то происходит следующее: элемент управления Head (обратите внимание на runat="server") не может видеть элемент управления Title в его элементах управления и поэтому добавляет пустой заголовок тега до конца.

Большинство ответов здесь верны, но для минимального изменения вы можете сделать следующее: добавить следующее к вашему головному элементу управления -

<title id="Title1" visible="false" runat="server"><%-- hack to turn the auto title off --%></title>

Другие опции включают -

  • Снимите runat="server" с головного устройства управления, но это будет означать, что вы не можете использовать серверные элементы управления
  • Используйте элемент управления «Название» и установите его программно, как ваше решение.

Мне нравится тег скрытого заголовка, потому что он позволяет вам использовать подход ContentPlaceholder, который сохраняет его в шаблоне. Он также позволяет использовать пользовательский элемент управления для получения заголовка (в нашем случае мы используем стороннюю библиотеку для извлечения заголовка из БД)

См. Этот пост в блоге Фила Хаака для справки об этом.

8 голосов
/ 20 января 2010

Заголовок вашего .master должен выглядеть так:

<head runat="server">
<title>Default Title</title>
  .. other tags
</head>

Затем в коде вашей страницы в Page_Load вы пишете:

protected void Page_Load(object sender, EventArgs e)
{
    this.Title = "My Page Title";
}
5 голосов
/ 18 марта 2010

Чтобы избежать дублирования тегов, просто сделайте следующее, без дополнительного кода.

В вашей MasterPage есть что-то вроде этого:

<head>
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>

И на каждой другой странице добавьте атрибут Title = "Your Title" в директиву страницы:

<%@ Page Title="Your Title" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

Это исключает дубликаты тегов и помещает заголовок в четкое, видимое место вверху в представлении кода.

Надеюсь, это поможет.

0 голосов
/ 03 мая 2013

Я думаю, используя:

Если вы хотите установить заголовок на уровне страницы

<%@ Master ... %>
<html>
<head runat="server">
  <title>
    <asp:ContentPlaceHolder ID="titleContent" runat="server" />
  </title>
</head>

Или,

Если вы хотите установить динамический заголовок на уровне мастер-страницы.

<%@ Master ... %>
<html>
<head runat="server">
  <title>
    <asp:Literal ID="litPageTitle" runat="server"></asp:Literal>
  </title>
</head>

- лучший способ убедиться, что пустой второй тег заголовка не генерируется.

0 голосов
/ 03 июля 2012

Спустя 2 года эта проблема все еще сохраняется. Попадание в SEO сайтов.

Использование MVC 4.5RC. Все, что вам нужно сделать, это поместить пустой тег перед областью основного содержимого. Нет необходимости перекодировать, установить заголовок внутри кода. Вот так:

<title></title>
<asp:contentPlaceHolder><title>Rise Sir...</title><asp:contentPlaceHolder>

Simple.

0 голосов
/ 20 января 2010

Определяя элемент управления <asp:Content ContentPlaceHolderID="head">, вы не изменяете заголовок, который уже существует, а вместо этого добавляете больше разметки в держатель содержимого с идентификатором «head». На вашей главной странице, я думаю, у вас есть что-то вроде этого:

<head>
  <title>Master Page Title</title>
  <asp:ContentPlaceHolder id="head" runat="Server" />
</head>

Таким образом, <asp:ContentPlaceHolder> заменяется на <asp:Content ContentPlaceHolderID="head">, так что вы получите второй <title> элемент.

Поэтому удалите <title> со своей главной страницы - это означает, что вам понадобятся <title> в всех ваших aspx-файлах - или используйте некоторый код, чтобы сделать что-то подобное ...

this.Title = pageTitle;
// if that doesn't do it try
// this.Header.Title = pageTitle;
0 голосов
/ 20 января 2010

Если на главной странице заголовок раздела выглядит следующим образом:
<title><%=someTitleVariable%></title>

, затем используйте вместо этого этот код:
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <%=pageTitle%> </asp:Content>

0 голосов
/ 20 января 2010

Попробуйте вместо этого

        ((MyPageClass)Page).Title = "Your Page Title"

Этот код входит в Page_Load вашей главной страницы.Я должен использовать приведение ("MyPageClass"), потому что я извлекаю свой собственный PageClass, чтобы я мог поместить туда строго типизированные объекты сеанса.Если вы этого не сделаете, то вам не понадобится приведение.

Если вам нужно сделать это на уровне страницы, я думаю, вы можете просто использовать:

     Title = "Your Page Title"

в своемPage_Load.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...