2009-09-16 21 views
24

Estoy intentando agregar programáticamente un <meta>. Está funcionando bien cuando hay un elemento Head con runat = "server" en la página .aspx.Agregar metaetiqueta programáticamente en C#

El código subyacente es:

HtmlMeta meta = new HtmlMeta(); 
meta.Name = "robots"; 
meta.Content = "noindex,follow"; 
this.Page.Header.Controls.Add(meta); 

Pero tengo una secuencia de comandos en la etiqueta de la cabeza que contiene bloques de código como <% ... %>, por lo que no puede mantener el valor runat = "server".

El problema es que tengo que agregar metaetiqueta programáticamente, porque depende de un valor de la base de datos.

¿Hay alguna manera de resolver este problema para que mi script dentro del elemento principal funcione como siempre y pueda agregar una metaetiqueta programáticamente?

Respuesta

35

bien, he probado el answer by veggerby, y funciona perfectamente:

En la sección <header>:

<asp:PlaceHolder id="MetaPlaceHolder" runat="server" /> 

Tenga en cuenta que Visual Studio podría mostrar una advertencia en la etiqueta de marcador de posición, ya que no se reconoce como un elemento conocido dentro del encabezado, pero puede ignorar esto. Funciona.

En el código C#:

HtmlMeta meta = new HtmlMeta(); 
meta.Name = "robots"; 
meta.Content = "noindex,follow"; 
MetaPlaceHolder.Controls.Add(meta); 

alternativa (ya que ya tiene bloques de código utilizando <% %> en su sección de encabezado), puede etiquetar la meta directamente y recuperar sólo el valor del lado del servidor:

<meta name="robots" content="<%=GetMetaRobotsValueFromDatabase()%>" /> 
+0

muchas gracias funciona perfectamente – subha

+0

Disculpas - El código era demasiado tiempo para publicar como un comentario por lo que añade una respuesta (utilizando su código) por debajo . ¡Muchas gracias! –

5

Intenta mover lo que sea que estés haciendo en el <% ....%> al código subyacente. Si está utilizando la secuencia de comandos para agregar contenido a la página, puede reemplazarla por una asp: control literal y luego establecer el valor que estaba calculando previamente en el bloque de secuencia de comandos para el código subyacente y establecer Literal.Text a ese valor.

2

No lo he probado, pero tal vez pueda agregar un <asp:Placeholder> dentro de la etiqueta <head></head> y agregar las metaetiquetas a esta.

+0

Gracias mucho su solución me ayudó – subha

6

O usted podría poner su meta-tag en la cabecera, con un ID y un runat = "server" ... entonces en el código detrás decir

myMetaTag.Content = "noindex,follow"; 

o

myMetaTag.Visible = false; 

o lo que quieras.

7

Muchas gracias a Awe for the solution! Implementé este código en una ASP (error404.ascx).NET control de usuario de la siguiente manera:

<%@ Control Language="C#"%> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.TrySkipIisCustomErrors = true; //Suppress IIS7 custom errors 
     Response.StatusCode = 404; 
     SetRobotsHeaderMetadata(); 
    } 

    private void SetRobotsHeaderMetadata() 
    { 
     HtmlMeta meta = new HtmlMeta(); 
     meta.Name = "robots"; 
     meta.Content = "noindex,follow"; 
     this.Page.Master.FindControl("cphPageMetaData").Controls.Add(meta); 
    } 
</script> 

Con el siguiente masterpage:

<%@ Master Language="C#" AutoEventWireup="true" Inherits="MyMaster" %> 
<script runat="server"> 
    ... 
</script> 

<!DOCTYPE html> 
<html lang="en-GB"> 
    <head> 
     <title>Site title here</title> 

     <asp:contentplaceholder runat="server" id="cphPageMetaData"> 
     </asp:contentplaceholder> 
    </head> 

    <body> 
     ... 
    </body> 
</html> 
0

La mejor solución para esto, que he comprobado con éxito sin ningún tipo de error o advertencia:

El código JavaScript, que contiene el código <% ... %>, se eliminó de la sección head y se colocó en la sección body.

0

Se podría definir su etiqueta meta como una cadena estática, así:

Private Shared MetaLanguage As String = 
    String.Format("<meta http-equiv=""Content-Language"" content=""{0}""/>", CultureInfo.CurrentUICulture.TwoLetterISOLanguageName) 

luego colocarlos en su cabeza, así:

<head runat="server"> 
    <%=MetaLanguage%> 
</head> 

Esto le permite utilizar cualquiera de los valores de etiquetas meta y es fácil de leer y personalizar Nota: El uso de la palabra clave Shared (estática) ayuda a mejorar el rendimiento.

-3

MetaDescription = "Su meta descripción va aquí"; MetaKeywords = "Keyword1, Keyword2, Keyword3";

6

creo que este es el mejor enfoque:

this.Page.Header.Controls.Add(new LiteralControl(@"<meta ... />")); 

Enjoy!

-3

OK ... De hecho, solo uso C# ... O HTML en C#. Nunca utilizo codebehind, diseñador o webcontrols en el archivo aspx ... Así que programo todo de clases ... Y dinámicamente.

Resultado:

HtmlMeta meta = new HtmlMeta(); 
meta.Name = "robots"; 
`meta.Content = "Here is what you want";` 
var page=HttpContext.Current.Handler as Page; 
page.Header.Controls.Add(meta); 
Cuestiones relacionadas