Pergunta

Preciso definir o título de uma página dinamicamente e, portanto, uso código semelhante ao seguinte:

<%@ 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>

Mas isso gera tags de título duplicado. Existe alguma maneira de contornar isso? Obrigado.

Editar: A seguir das sugestões abaixo, agora tenho o seguinte na minha página master:

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

E o seguinte na minha página principal:

    this.Title="xxx";

Mas não estou recebendo nenhum título (nem "título padrão" nem "xxx").

EDIT: Esperam. Consegui funcionar usando esse método.

Foi útil?

Solução

O cabeçalho do seu mestre precisa ser assim:

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

Então, na sua página Código-Behind no Page_load, você escreve:

protected void Page_Load(object sender, EventArgs e)
{
    this.Title = "My Page Title";
}

Outras dicas

Se a segunda etiqueta do título estivesse vazia e no final do head tag, então o que está acontecendo é que o controle da cabeça (observe o runat="server") não pode ver um controle de título nos controles e, portanto, adicionar uma tag de título vazia ao final.

A maioria das respostas aqui é válida, mas para uma mudança mínima, o que você poderia fazer é Adicione o seguinte ao seu controle de cabeça-

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

Outras opções incluem-

  • Levar a runat="server" fora do controle da cabeça, mas isso significa que você não pode usar os controles laterais do servidor
  • Use um controle de título e defina -o programaticamente, como sua solução.

Gosto da tag de título oculto, porque ela permite que você use a abordagem do conteúdo do local de conteúdo, que a mantém no modelo. Ele também permite que você use um controle personalizado para obter o título (no nosso caso, estamos usando uma biblioteca de terceiros para puxar o título de um banco de dados)

Veja esta postagem do blog de Phil Haack para o fundo disso.

Para evitar as tags duplicadas, faça o seguinte, sem código extra.

Em sua página -mastagem, tenha algo assim:

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

E em todas as outras páginas, adicione o atributo "Seu título" à diretiva da página:

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

Isso elimina suas tags duplicadas e coloca o título em um local claro e visível na parte superior da exibição de código.

Espero que isto ajude.

Tente isso em vez disso

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

Este código vai no Page_load da sua página mestre. Eu tenho que usar um elenco ("myPageClass") porque eu derivo meu próprio pageClass para que eu possa colocar objetos de sessão digitada fortemente lá. Se não, então você não precisará do elenco.

Se você precisar fazer isso no nível da página, acho que você pode usar:

     Title = "Your Page Title"

em sua página_load.

Se em sua página mestra a seção de título se parecer com o seguinte:
<title><%=someTitleVariable%></title>

Em seguida, use isso como seu código:
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <%=pageTitle%> </asp:Content>

Na definição de um <asp:Content ContentPlaceHolderID="head"> Controle Você não está modificando o título que já está lá, mas, em vez disso, está adicionando mais marcação ao titular do Place de Conteúdo com o ID "Head". Na sua página mestre, eu imagino que você tenha algo assim:

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

Então o <asp:ContentPlaceHolder> é substituído pelo <asp:Content ContentPlaceHolderID="head"> Então você acaba com um segundo <title> elemento.

Portanto, remova o <title> da sua página mestre - o que significa que você precisará do <title> dentro tudo Seus arquivos ASPX - ou use algum código para fazer algo assim ...

this.Title = pageTitle;
// if that doesn't do it try
// this.Header.Title = pageTitle;

Eu acho que usar:

Se você deseja definir o título no nível da página

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

Ou,

Se você deseja definir o título dinâmico no nível da página mestre.

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

é uma maneira melhor de garantir que a segunda tag de título vazia não seja gerada.

Cerca de 2 anos depois, essa questão ainda persiste. Atingindo SEO de sites.

Usando o MVC 4.5rc. Tudo o que você precisa fazer é colocar uma etiqueta vazia antes da área de conteúdo mestre. Não há necessidade de recodificar, defina o título dentro do código. Igual a:

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

Simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top