我正在尝试以编程方式添加<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元素中的脚本像往常一样工作,我可以通过编程方式添加元标记?
答案 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);