Ektron 8.6 - 将元数据标签附加到页面的Head标签中

时间:2014-08-06 15:59:05

标签: .net ektron

我正在尝试动态地将一些元数据附加到Ektron的页面上。

我在Ektron的设置区域中创建了一个元数据项目,名为" Twitter Card"已设置为文本属性。

由于Twitter卡Metatags不同,它们依赖于页面级别,因此通过在页面设置中使用元数据选项添加它似乎是唯一可能的解决方案。

我已将以下内容添加到主模板的“头部”中。

asp:Literal ID="SetTwitterCard" runat="server" 

我还将此添加到页面的.cs部分,但我没有成功

protected void SetTwitterCard ()
{
  HtmlMeta meta = new HtmlMeta();
  meta.Name = "TwitterCard";
  meta.Content = this.CurrentPage.GetMetaDataValue(Resources.Metadata.TwitterCard);
  this.Page.Header.Controls.Add(meta);
}

2 个答案:

答案 0 :(得分:0)

如果您使用ASPX页面前端定义的文字,那么您不需要以编程方式将任何控件添加到Page.Header.Controls。选择一种方法或另一种方法。

通用代码

首先,将此代码添加到您的网页类。它将ContentData加载来自主内容块的元数据(如果存在)(id查询字符串参数)并返回到表单块(如果存在)(ekfrm查询字符串参数)并最终掉落返回PageBuilder页面布局(如果存在)(pageid查询字符串参数)。 选项1 选项2 都需要所有这些"公共代码"出现在你的页面类中以便运行。

private bool _isContentLoaded;
private Ektron.Cms.ContentData _content;

private string GetMetadataFromPrimaryContent(string metadataName)
{
    EnsureContentIsLoadedFromEktron();

    if (_content == null || _content.MetaData == null) return null;

    var data = _content.MetaData.FirstOrDefault(md => md.Name == metadataName);
    return data == null ? null : data.Text;
}

private void EnsureContentIsLoadedFromEktron()
{
    if (_isContentLoaded) return;

    _isContentLoaded = true;
    var cm = new Ektron.Cms.Framework.Content.ContentManager();

    long id;
    long.TryParse(Request.QueryString["id"], out id);

    if (id > 0)
        _content = cm.GetItem(id, true);

    if (_content != null) return;

    long.TryParse(Request.QueryString["ekfrm"], out id);
    if (id > 0)
        _content = cm.GetItem(id, true);

    if (_content != null) return;

    // if no content is returned and we have a page id,
    // try getting that content block, since PageBuilder
    // pages can have metadata on them.
    long.TryParse(Request.QueryString["pageid"], out id);
    if (id > 0)
        _content = cm.GetItem(id, true);
}

选项1:使用文字。

<asp:Literal ID="ltlTwitterCard" runat="server" />
protected void Page_Load(object sender, EventArgs e)
{
    var metadataValue = GetMetadataFromPrimaryContent("TwitterCard");
    if (!string.IsNullOrEmpty(metadataValue))
        ltlTwitterCard.Text = "<meta name=\"TwitterCard\" content=\""
                                + metadataValue
                                + "\" >";
}

选项2:以编程方式将控件添加到Head。

如果使用此路线,请从www.asp.net注意以下内容:

  

请注意,<head>元素包含runat="server"   属性,表示它是服务器控件(而不是   静态HTML)。

protected void Page_Load(object sender, EventArgs e)
{
    var meta = new HtmlMeta
    {
        Name = "TwitterCard",
        Content = GetMetadataFromPrimaryContent("TwitterCard") ?? ""
    };

    this.Page.Header.Controls.Add(meta);
}

答案 1 :(得分:0)

假设this.CurrentPage.GetMetaDataValue(Resources.Metadata.TwitterCard)有效,以下是我通常在我的母版页上添加元数据的方法。它也适用于你的情况。

前端:

<meta id="metaTwitterCard" runat="server" name="TwitterCard" content=""/>

后端:

    protected void SetTwitterCard ()
    {
      /*HtmlMeta meta = new HtmlMeta();
      meta.Name = "TwitterCard";
      meta.Content = this.CurrentPage.GetMetaDataValue(Resources.Metadata.TwitterCard);
      this.Page.Header.Controls.Add(meta);*/

      // Fill in "TwitterCard" content.
      metaTwitterCard.Content = this.CurrentPage.GetMetaDataValue(Resources.Metadata.TwitterCard);
      // Hide meta tag if content invalid or unavailable.
      metaTwitterCard.Visible = !String.IsNullOrWhiteSpace(metaTwitterCard.Content);
    }