Как добавить атрибут в тег заголовка - PullRequest
1 голос
/ 22 октября 2010

Я использую веб-формы ASP.NET, с мастер-страницами.Я хочу добавить атрибут LANG в тег <title>.ASP.NET автоматически генерирует тег заголовка.Я попытался добавить свой собственный тег с идентификатором и runat = "server", например так:

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

При этом я могу установить атрибут, подобный следующему, без ошибок.

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

Однако ASP.NET полностью стирает мой тег <title> и добавляет свой собственный без моего атрибута LANG.Есть ли способ сделать это?Большое спасибо.

1 Ответ

3 голосов
/ 24 октября 2010

Это происходит потому, что элемент управления HtmlTitle не обеспечивает реализацию RenderAttributes . В этом случае вы не можете (легко) создать подкласс элемента управления, но есть и другой вариант. Мощность управляющих адаптеров не ограничивается WebControls - концепция также распространяется и на на HtmlControls.

Перетащите следующее в * .browser файл в каталог App_Browsers вашего сайта:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...