32 votes

Ajouter une balise méta de façon programmatique en C#

J'essaie d'ajouter de manière programmatique un <meta> . Il fonctionne bien lorsqu'il y a un Head élément avec runat = "server" dans le .aspx page.

Le code derrière est :

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

Mais j'ai des script dans la balise head qui contiennent des blocs de code comme <% ... %> donc je ne peux pas garder le runat = "server" valeur.

Le problème est que je dois ajouter la métabalise par programme, car elle dépend d'une valeur de la base de données.

Existe-t-il un moyen de résoudre ce problème afin que mon script à l'intérieur de l'élément head fonctionne comme d'habitude et que je puisse ajouter une balise méta de manière programmatique ?

42voto

awe Points 9697

OK, j'ai testé le réponse par veggerby et cela fonctionne parfaitement :

Dans le <header> section :

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

Notez que Visual Studio peut afficher un avertissement sur la balise PlaceHolder, car elle n'est pas reconnue comme un élément connu dans l'en-tête, mais vous pouvez l'ignorer. Cela fonctionne.

Dans le code C# :

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

Alternativement (puisque vous avez déjà des blocs de code utilisant <% %> dans votre section d'en-tête), vous pouvez marquer la méta directement et récupérer uniquement la valeur du côté serveur :

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

8voto

Jonathan Williams Points 885

Un grand merci à Awe pour la solution ! J'ai implémenté ce code dans un contrôle utilisateur ASP.NET (error404.ascx) comme suit :

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

Avec la page maîtresse suivante :

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

6voto

Timothy Khouri Points 14640

Ou vous pouvez simplement mettre votre métabalise dans l'en-tête, avec un ID et un runat="server"... puis dans le code derrière dire

myMetaTag.Content = "noindex,follow";

ou

myMetaTag.Visible = false;

ou ce que vous voulez.

6voto

SmartDev Points 73

Je pense que c'est la meilleure approche :

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

Profitez-en !

5voto

user152492 Points 21

Essayez de déplacer ce que vous faites dans le <% .... %> vers le code-behind. Si vous utilisez le script pour ajouter du contenu dans la page, vous pouvez le remplacer par un contrôle asp:Literal, puis définir la valeur que vous calculiez précédemment dans le bloc script dans le code-behind et définir Literal.Text sur cette valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X