C# 在C中以编程方式添加元标记#
我正在尝试以编程方式添加C# 在C中以编程方式添加元标记#,c#,asp.net,C#,Asp.net,我正在尝试以编程方式添加。当.aspx页面中有Head元素带有runat=“server”时,它工作正常 背后的代码是: HtmlMeta meta = new HtmlMeta(); meta.Name = "robots"; meta.Content = "noindex,follow"; this.Page.Header.Controls.Add(meta); 但是我在head标记中有一些脚本,它包含像这样的代码块,因此我无法保留runat=“server”值 问题是我必须以编程方式添加
。当.aspx
页面中有Head
元素带有runat=“server”
时,它工作正常
背后的代码是:
HtmlMeta meta = new HtmlMeta();
meta.Name = "robots";
meta.Content = "noindex,follow";
this.Page.Header.Controls.Add(meta);
但是我在head标记中有一些脚本,它包含像
这样的代码块,因此我无法保留runat=“server”
值
问题是我必须以编程方式添加meta标记,因为它依赖于数据库中的值
有没有办法解决这个问题,使我在head元素中的脚本能够正常工作,并且我可以通过编程方式添加元标记?尝试将您在中所做的任何事情移动到后面的代码中。如果使用脚本将内容添加到页面中,可以将其替换为asp:Literal控件,然后将以前在脚本块中计算的值设置为代码隐藏,并将Literal.Text设置为该值。我没有测试它,但是,也许您可以在
标记中添加
,并将元标记添加到此标记中。或者您可以将元标记放在标题中,带有ID和runat=“server”。。。然后在代码后面说
myMetaTag.Content = "noindex,follow";
或
或者你想要的任何东西。好的,我测试了,它工作得非常好:
在
部分:
<asp:PlaceHolder id="MetaPlaceHolder" runat="server" />
或者(因为在标题部分中已经有使用
的代码块),您可以直接标记元数据,并仅从服务器端检索值:
<meta name="robots" content="<%=GetMetaRobotsValueFromDatabase()%>" />
非常感谢您!我在(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>
受保护的无效页面加载(对象发送方、事件参数e)
{
Response.tryskipiiscustomerors=true;//抑制IIS7自定义错误
Response.StatusCode=404;
SetRobotsHeaderMetadata();
}
私有void SetRobotsHeaderMetadata()
{
HtmlMeta=新的HtmlMeta();
meta.Name=“机器人”;
meta.Content=“noindex,follow”;
this.Page.Master.FindControl(“cphPageMetaData”).Controls.Add(meta);
}
使用以下母版页:
<%@ 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>
...
网站名称在这里
...
这是最好的解决方案,我成功地检查了它,没有任何错误或警告:
包含
代码的JavaScript代码已从head
部分删除,并放置在body
部分。您可以将元标记定义为静态字符串,如下所示:
Private Shared MetaLanguage As String =
String.Format("<meta http-equiv=""Content-Language"" content=""{0}""/>", CultureInfo.CurrentUICulture.TwoLetterISOLanguageName)
私有共享元语言作为字符串=
String.Format(“,CultureInfo.CurrentUICulture.TwoLetterIsLanguageName)
然后把它们放在你的脑袋里,就像这样:
<head runat="server">
<%=MetaLanguage%>
</head>
这允许您使用任何元标记值,并且易于阅读和自定义。注意:使用Shared
关键字(静态)有助于提高性能。MetaDescription=“您的MetaDescription在此显示”;
MetaKeywords=“关键字1、关键字2、关键字3” 我认为这是最好的方法:
this.Page.Header.Controls.Add(new LiteralControl(@"<meta ... />"));
this.Page.Header.Controls.Add(新的LiteralControl(@“”);
享受吧 好的。。。实际上我只使用C#。。。或将HTML转换为C#。我从不在文件aspx中使用codebehind、designer或WebControl。。。所以我把所有的课程都安排好了。。。而且是动态的 结果:
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);
抱歉-代码太长,无法作为评论发布,因此我在下面添加了一个答案(使用您的代码)。非常感谢!我知道有点晚了,但是有没有什么原因让你选择使用
LiteralControl
来覆盖一个?另外,我认为这并不能回答OPs的问题,因为标头不是服务器控件。页眉将为空
this.Page.Header.Controls.Add(new LiteralControl(@"<meta ... />"));
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);