【问题标题】:Ektron 8.6 - Appending Metadata Tags into the Head tags of a pageEktron 8.6 - 将元数据标签附加到页面的头部标签中
【发布时间】:2014-08-06 15:59:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: .net ektron


    【解决方案1】:

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

    通用代码

    首先,将此代码添加到您的页面类中。它从主要内容块(id 查询字符串参数)加载ContentData 及其元数据,如果存在(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的以下内容:

    注意&lt;head&gt; 元素包含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);
    }
    

    【讨论】:

    • 良好的反应。我会为“ekfrm”添加一个查询字符串检查——Ektron 的 HTML 表单的查询字符串参数。我实际上创建了第三个方法/属性来返回当前页面的 ID,首先查找 id,然后是 ekfrm,然后是 pageid,按此顺序。
    • 好点,@egandalf!我已经更新了我的答案,包括在最终回归 pageid 之前回归“ekfrm”。我之前使用过一种仅返回 id 的方法,效果非常好。然而,我喜欢这种方法的一件事是,如果您使用页面布局作为模板(因此 url 同时具有“id”和“pageid”),您可以使用页面布局的元数据指定不存在的内容 id 的事件。例如:?id=75&pageid=102 -> 内容 id 75 已删除,我可以显示“未找到”消息但仍从页面布局加载元数据。
    • 感谢您的回复,非常感谢,我尝试了选项 1,当我将鼠标悬停在字词上时 - GetMetadataFromPrimaryContent and Content 我得到“当前上下文中不存在名称 GetMetadataFromPrimaryContent。我会尝试其他选项,看看它们是否有效。
    • 我已经有了这段代码,它从受保护的页面元数据中附加页面标题和描述 void SetPageMeta() { if (this.CurrentPage != null) { if (!string.IsNullOrEmpty(this. CurrentPage.GetMetaDataValue(Resources.Metadata.PageTitle))) { PageTitle.Text = this.CurrentPage.GetMetaDataValue(Resources.Metadata.PageTitle) + " | 我的网站 "; } else { PageTitle.Text = CurrentPage.Title + " | 我的网站 "; } HtmlMeta 元 = 新 HtmlMeta(); meta.Name = "描述"; meta.Content =this.CurrentPage.GetMetaDataValue(Resources.Metadata.PageDescription); this.Page.Header.Controls.Add(meta); } }
    • @DaveKane - 方法“GetMetadataFromPrimaryContent”存在于“通用代码”部分。变量“content”是一个类型-o,应该是“metadataValue”。我会相应地更新我的答案。
    【解决方案2】:

    假设 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);
        }
    

    【讨论】:

    • 您好,感谢您提供此解决方案,但是我在此行中的“TwitterCard”文本下方出现“红色”错误行 metaTwitterCard.Content = this.CurrentPage.GetMetaDataValue(Resources.Metadata.TwitterCard);错误消息显示 - Resources.Metadata 不包含 TwitterCard 的定义。有什么想法吗?
    • 当然。右键单击 .Metadata。从代码中的该行开始,然后在弹出的上下文菜单中单击“转到定义”。这会将您带到定义 Resources.Metadata 的任何地方。如果您还没有,您应该在其中定义 .TwitterCard。我认为这些只是将您的 Ektron 元数据定义名称作为字符串的访问器。
    • 感谢您,看来我需要将新的元数据定义添加到该区域,但是它在 DLL 文件中全部加密,元数据文件被锁定..
    • 好吧,只是另一个猜测:您可能有一个名为 Metadata 的资源文件 (.resx),其中包含您的元数据定义名称。它们的常见位置在站点的 App_GlobalResources 和 App_LocalResources 文件夹中(如果存在)。如果一切都失败了,请尝试将“Twitter Card”传递给 this.CurrentPage.GetMetaDataValue( 方法以查看是否一切正常。
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2022-11-28
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2021-09-12
    • 2014-11-06
    • 2023-03-17
    相关资源
    最近更新 更多