是否可以将ASP.Net控件配置为接受任何属性,甚至是未定义为类定义中的属性的属性?

时间:2009-10-24 16:10:55

标签: asp.net controls

是否可以将控件定义为具有非指定的属性集?例如:

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

我不想事先为“SomeAttribute”在控件类上定义属性。我真的很喜欢HashTable或其他类似的构造:

"SomeAttribute" => "SomeValue"

因此,这个控件可以在许多地方使用,其属性基本上是在运行时组成的。

我想知道是否有一些解析方法我可以覆盖它在解析时迭代属性。我可以:

  1. 查找名称并设置的属性
  2. 如果我找不到这样的属性,请将属性名称和值放入HashTable
  3. 可能的?

1 个答案:

答案 0 :(得分:4)

您想使用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。这意味着您将无法在代码中看到id-或runat-attribute。已分配的属性(attr =“&lt;%= DateTime.Now%&gt;”)显示为空字符串。数据绑定属性在设计模式下根本不显示,但在正常模式下工作(假设有人像往常一样调用DataBind)。