在C#中以编程方式添加元标记

时间:2009-09-16 11:33:42

标签: c# asp.net

我正在尝试以编程方式添加<meta>。如果Head页面中有runat = "server".aspx元素,则此功能正常。

背后的代码是:

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

但我在head标签中有一些脚本,其中包含<% ... %>等代码块,因此我无法保留runat = "server"值。

问题是我必须以编程方式添加元标记,因为它取决于数据库中的值。

有没有办法解决这个问题,以便head元素中的脚本像往常一样工作,我可以通过编程方式添加元标记?

10 个答案:

答案 0 :(得分:39)

好的,我测试了answer by veggerby,它完美无缺:

<header>部分:

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

请注意,Visual Studio可能会在PlaceHolder标记上显示警告,因为它不会被标识为标题内的已知元素,但您可以忽略它。它有效。

在C#代码中:

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

或者(因为您已经在标题部分使用了<% %>代码块),您可以直接标记元数据并仅从服务器端检索值:

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

答案 1 :(得分:7)

非常感谢Awe for the solution!我已在(error404.ascx)ASP.NET用户控件中实现此代码,如下所示:

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

使用以下主页:

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

答案 2 :(得分:6)

或者你可以把你的元标记放在标题中,带有一个ID和一个runat =“server”......然后在后面的代码中说

myMetaTag.Content = "noindex,follow";

myMetaTag.Visible = false;

或者你想要的任何东西。

答案 3 :(得分:6)

我认为这是最好的方法:

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

享受!

答案 4 :(得分:5)

尝试在&lt;%....%&gt;中移动你正在做的任何事情。代码隐藏。如果您使用脚本将内容添加到页面中,则可以将其替换为asp:Literal控件,然后将先前在脚本块中计算的值设置为代码隐藏,并将Literal.Text设置为该值。

答案 5 :(得分:2)

我尚未对其进行测试,但您可以在<asp:Placeholder>标记内添加<head></head>并将元标记添加到此标记中。

答案 6 :(得分:0)

最佳解决方案,我成功检查了没有任何错误或警告:

包含<% ... %>代码的JavaScript代码已从head部分移除,并放置在body部分。

答案 7 :(得分:0)

您可以将元标记定义为静态字符串,如下所示:

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

然后把它们放在你的脑袋里:

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

这允许您使用任何元标记值,并且易于阅读和自定义。注意:使用Shared关键字(静态)有助于提高性能。

答案 8 :(得分:-3)

MetaDescription =“你的元描述就在这里”;   MetaKeywords =“Keyword1,Keyword2,Keyword3”;

答案 9 :(得分:-3)

好的......我实际上只将C#...或HTML用于C#。 我从不在文件aspx中使用代码隐藏,设计器或web控件...... 所以我从类中编程所有 ...并动态地。

结果:

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);