如何向Title标签添加属性

时间:2010-10-22 18:49:29

标签: asp.net webforms

我正在使用带有主页的webforms ASP.NET。我想在<title>标记中添加LANG属性。 ASP.NET自动生成标题标记。我已经尝试使用ID和runat =“server”添加我自己的标记,如下所示:

<title id="titleBlock" runat="server"></title>

执行此操作时,我可以设置如下所示的属性而不会出现任何错误。

titleBlock.Attributes.Add("lang", "it");

然而,ASP.NET完全删除了我的<title>标记,并在没有我的LANG属性的情况下放入了它。有没有办法实现这个目标?非常感谢。

1 个答案:

答案 0 :(得分:3)

这是因为 HtmlTitle 控件未提供 RenderAttributes 实现。在这种情况下,您不能(轻松)子类化控件,但还有另一种选择。 控制适配器的强大功能不仅限于WebControls,也是HtmlControls的概念extends

将以下内容放在网站 App_Browsers 目录下的* .browser文件中:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter 
        controlType="System.Web.UI.HtmlControls.HtmlTitle"
        adapterType="HtmlTitleAdapter" 
      />
    </controlAdapters>
  </browser>
</browsers>

这是相应适配器的原型:

using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;

public class HtmlTitleAdapter : System.Web.UI.Adapters.ControlAdapter
{
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        HtmlTitle title = Control as HtmlTitle;

        writer.WriteBeginTag("title");
        title.Attributes.Render(writer);
        writer.Write(">");

        if (title.Text != null)
            writer.Write(title.Text);

        writer.WriteEndTag("title");
    }
}

请注意,HtmlTitle的内部渲染实现有所不同:

protected internal override void Render(HtmlTextWriter writer)
{
    writer.RenderBeginTag(HtmlTextWriterTag.Title);
    if (this.HasControls() || base.HasRenderDelegate())
    {
        this.RenderChildren(writer);
    }
    else if (this._text != null)
    {
        writer.Write(this._text);
    }
    writer.RenderEndTag();
}

我不确定标题何时会有子元素,所以我认为这不是问题。

希望这有帮助。

顺便说一句,使用jQuery在客户端上添加此属性要容易得多。

 <script type="text/javascript">
    $(document).ready(function() {
        $("title").attr("lang", "it");
    });
</script>