【问题标题】:Update meta tags of asp.net master from the child page with C#使用 C# 从子页面更新 asp.net master 的元标记
【发布时间】:2013-04-30 08:10:15
【问题描述】:

我正在寻找一种方法来更新已在我的母版页中硬编码的元 descriptionkeywords 标记。其中一个子页面动态生成这两个元标记,因此我想动态添加它们。这是我当前用于向页面添加键和描述的子页面的代码。

protected void Page_Load(object sender, EventArgs e)
{
    this.Page.Title = lblPackTitle.Text;
    System.Web.UI.HtmlControls.HtmlMeta metaTagKey = new System.Web.UI.HtmlControls.HtmlMeta();
    metaTagKey.Name = "Keywords";
    metaTagKey.Content = "This is my keyword text";
    this.Header.Controls.Add(metaTagKey);
    System.Web.UI.HtmlControls.HtmlMeta metaTagDesc = new System.Web.UI.HtmlControls.HtmlMeta();
    metaTagDesc.Name = "description";
    metaTagDesc.Content = "This is my description text";
    this.Header.Controls.Add(metaTagDesc);
}

它工作正常,但这里的问题是,当页面呈现时,它宁愿生成 2 个“description”和 2 个“keyword”标签,即 MasterPage(硬编码)和其他,在页面加载时动态添加。

那么,有没有什么方法可以动态更新母版页中已有的元标记,或者只删除母版页上的元标记并只添加动态添加的(从子页),每次呈现子页时?

我的项目是使用 C# 的 asp.net 3.5

【问题讨论】:

  • 你试过placeHolders吗?
  • 你的意思是占位符放在母版页的头部,然后在页面加载时更新相同的内容?

标签: c# asp.net meta


【解决方案1】:

好吧,我找到了一个解决方案,而且渲染后看起来工作正常,我希望它在每种情况下都能正常工作。

在我的母版页中,我使用 ID 定义了我的 descriptionkeywords 标记,即 desckey,然后在我的子页面加载时我做了:

protected void Page_Load(object sender, EventArgs e)
{
    this.Page.Title = lblPackTitle.Text;
    System.Web.UI.HtmlControls.HtmlMeta metaTagKey = new System.Web.UI.HtmlControls.HtmlMeta();
    metaTagKey.Name = "Keywords";
    metaTagKey.Content = "This is my keyword text";
    this.Header.Controls.Add(metaTagKey);
    System.Web.UI.HtmlControls.HtmlMeta metaTagDesc = new System.Web.UI.HtmlControls.HtmlMeta();
    metaTagDesc.Name = "description";
    metaTagDesc.Content = "This is my description text";
    this.Header.Controls.Add(metaTagDesc);
    //----------------------------Added here-----------------------------
    Control ctrlKeyMeta = this.Header.FindControl("key");
    Control ctrlDescMeta = this.Header.FindControl("desc");
    ctrlKeyMeta.Visible = false;
    ctrlDescMeta.Visible = false;
}

【讨论】:

    【解决方案2】:

    将元内容项公开为具有默认值的属性并基于该值呈现它们(事实上,您甚至不需要这样做,因为页面会公开属性,但您可能需要顶级主默认值,查看页面的属性)。然后页面开始时没有元元素,如果它们未被触及,则默认内容被写出,否则被更改的内容被写入:

    public MetaTitle { get; set; }
    public MetaDescription { get; set; }
    public MetaKeywords { get; set; }
    
    ...
    
    var tag = new HtmlMeta();
    tag.Name = "description";
    tag.Content = MetaDescription;
    this.Header.Controls.Add(tag);
    

    可以在请求生命周期管道上进一步设置属性,并由各个页面覆盖。没有重复。那么,关键是它硬编码默认值,而是提供一些默认值以及这些相同事物的灵活性。

    【讨论】:

    • 感谢格兰特试用它,但我无法让它进入我的脑海 ;-),这对我来说似乎是一个全新的东西,因为我是一个平庸的开发人员,而且get;set; 对我来说是新事物,你在这里所说的完全不明白,对不起......但如果你能用简单的话解释它会很棒。
    【解决方案3】:

    进一步的问题:这会将元描述添加为标题部分中的最后一行项目。如果它最后在头部而不是顶部,真的有什么不同吗?

          protected void Page_Load(object sender, EventArgs e)
        {
            HtmlHead header1 = (HtmlHead)Master.FindControl("head1");
    
            header1.Controls.Remove(header1.FindControl("desc1"));
    
            HtmlMeta description = new HtmlMeta();
            //System.Web.UI.HtmlControls.HtmlMeta description = new System.Web.UI.HtmlControls.HtmlMeta();
    
            description.Name = "description";
            description.Content = "We are a family owned and operated painting company. We serve homeowners in Northern Virginia and Washington DC";
    
            this.Header.Controls.Add(description);
        }
    

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2013-10-07
      • 2022-01-04
      • 2017-03-12
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2017-05-22
      相关资源
      最近更新 更多