Можно ли настроить элемент управления ASP.Net для приема ЛЮБЫХ атрибутов, даже если они не определены как свойства в определении класса? - PullRequest
0 голосов
/ 24 октября 2009

Можно ли определить элемент управления, чтобы иметь неопределенный набор атрибутов? Например:

<MyPrefix:MyControl SomeAttribute="SomeValue" runat="server"/>

Я не хочу заранее определять свойство класса управления для «SomeAttribute». Я бы просто хотел HashTable или какую-то другую конструкцию, подобную этой:

"SomeAttribute" => "SomeValue"

Таким образом, этот элемент управления может использоваться во многих местах с атрибутами, которые по существу составлены во время выполнения.

Интересно, есть ли какой-нибудь метод синтаксического анализа, который я могу переопределить, который перебирает атрибуты во время анализа Я могу:

  1. Найдите свойство с именем и установите его
  2. Если я не нахожу такое свойство, поместите имя атрибута и значение в HashTable

возможно?

1 Ответ

4 голосов
/ 24 октября 2009

Вы хотите использовать интерфейс IAttributeAccessor .

Определяет методы, используемые серверными элементами управления ASP.NET для обеспечения программного доступа к любому атрибуту, объявленному в открывающем теге серверного элемента управления.

Пример управления:

using System;
using System.Collections.Generic;
using System.Web.UI;

namespace App_Code.Controls {
    public class OutputAttributesControl : Control, IAttributeAccessor {
        private readonly IDictionary<String, String> _attributes = new Dictionary<String, String>();

        protected override void Render(HtmlTextWriter writer) {
            writer.Write("Attributes:<br/>");
            if (_attributes.Count > 0) {
                foreach (var pair in _attributes) {
                    writer.Write("{0} = {1} <br/>", pair.Key, pair.Value);
                }
            } else {
                writer.Write("(None)");
            }
        }

        public String GetAttribute(String key) {
            return _attributes[key];
        }

        public void SetAttribute(String key, String value) {
            _attributes[key] = value;
        }
    }
}

Призвание:

<AppCode:OutputAttributesControl runat="server" attr="value" />

Выход:

Attributes:
attr = value

Предостережения:

Кажется, что SetAttribute вызывается только для атрибутов, которые не могут быть разрешены нормально. Это означает, что вы не увидите идентификатор или атрибут runat в вашем коде. Назначенные свойства (attr = "<% = DateTime.Now%>") отображаются в виде пустой строки. Свойства привязки данных вообще не отображаются в режиме разработки, но работают в обычном режиме (при условии, что кто-то вызвал DataBind, как обычно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...