是否可以将控件定义为具有非指定的属性集?例如:
<MyPrefix:MyControl SomeAttribute="SomeValue" runat="server"/>
我不想事先为“SomeAttribute”在控件类上定义属性。我真的很喜欢HashTable或其他类似的构造:
"SomeAttribute" => "SomeValue"
因此,这个控件可以在许多地方使用,其属性基本上是在运行时组成的。
我想知道是否有一些解析方法我可以覆盖它在解析时迭代属性。我可以:
可能的?
答案 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)。