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

sub*_*bha 27 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);
Run Code Online (Sandbox Code Playgroud)

但是我在head标签中有一些包含代码块的脚本<% ... %>,所以我无法保留该runat = "server"值.

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

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

awe*_*awe 39

好的,我测试了veggerby答案,它完美无缺:

在该<header>部分:

<asp:PlaceHolder id="MetaPlaceHolder" runat="server" />
Run Code Online (Sandbox Code Playgroud)

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

在C#代码中:

HtmlMeta meta = new HtmlMeta();
meta.Name = "robots";
meta.Content = "noindex,follow";
MetaPlaceHolder.Controls.Add(meta);
Run Code Online (Sandbox Code Playgroud)

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

<meta name="robots" content="<%=GetMetaRobotsValueFromDatabase()%>" />
Run Code Online (Sandbox Code Playgroud)


Jon*_*ams 7

非常感谢Awe的解决方案!我已在(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>
Run Code Online (Sandbox Code Playgroud)

使用以下主页:

<%@ 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>
Run Code Online (Sandbox Code Playgroud)


Tim*_*uri 6

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

myMetaTag.Content = "noindex,follow";
Run Code Online (Sandbox Code Playgroud)

要么

myMetaTag.Visible = false;
Run Code Online (Sandbox Code Playgroud)

或者你想要的任何东西.


Mik*_*ike 5

尝试将您在<%....%>中执行的任何操作移动到代码隐藏中.如果您使用脚本将内容添加到页面中,则可以将其替换为asp:Literal控件,然后将先前在脚本块中计算的值设置为代码隐藏,并将Literal.Text设置为该值.


Sma*_*Dev 5

我认为这是最好的方法:

this.Page.Header.Controls.Add(new LiteralControl(@"<meta ... />"));
Run Code Online (Sandbox Code Playgroud)

请享用!