Here 在代码隐藏中,我可以找到 转换为 HtmlAnchor : private void Repeater1_ItemDataBo-6ren">
gpt4 book ai didi

c# - HTML 标签如何转换为 HtmlControl?

转载 作者:行者123 更新时间:2023-11-30 16:49:33 24 4
gpt4 key购买 nike

假设我有这个标记:

<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<a runat="server" id="myLink" href="<%# Container.DataItem %>">Here</a>
</ItemTemplate>
</asp:Repeater>

在代码隐藏中,我可以找到 <a>转换为 HtmlAnchor :

private void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
HtmlAnchor myLink = (HtmlAnchor)Repeater1.FindControl("myLink");
}

但是编译器怎么知道<a>HtmlAnchor ?它是在编译器中硬编码的吗?

如果我写

<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<Foo href="<%# Container.DataItem %>">Here</a>
</ItemTemplate>
</asp:Repeater>

并想要<Foo>要转换为我的标签 HtmlFoo类,我该如何实现?

我只是想更深入地了解幕后的编译过程。

最佳答案

通过深入研究 Reference Source,您可以了解很多有关 ASP.NET 内部的知识.

事实证明,从无前缀的 HTML 标签到 HtmlControl 子类的映射被硬编码在一个名为 HtmlTagNameToTypeMapper 的内部类中。 :

static Hashtable _tagMap;

Type ITagNameToTypeMapper.GetControlType(string tagName, IDictionary attributeBag) {
Type controlType;

if (_tagMap == null) {
Hashtable t = new Hashtable(10, StringComparer.OrdinalIgnoreCase);
t.Add("a", typeof(HtmlAnchor));
t.Add("button", typeof(HtmlButton));
t.Add("form", typeof(HtmlForm));
// [and much more...]
_tagMap = t;
}

// [...]
}

GetControlType 由另一个名为 MainTagNameToTypeMapper 的内部类调用:

int colonIndex = tagName.IndexOf(':');
if (colonIndex >= 0) {
// [...]
}
else {
// There is no prefix.
// Try the Html mapper if allowed
if (fAllowHtmlTags) {
return _htmlMapper.GetControlType(tagName, attribs);
}
}

没有公共(public) API 可以注册更多无前缀的 HTML 控件类型。

在更本地化的范围内,父控件可以自定义如何解释其子控件的标签名称。为此,派生自 ControlBuilder,覆盖 GetChildControlType , 并用 [ControlBuilder(typeof(...)] attribute 修饰父控件类.

关于c# - HTML 标签如何转换为 HtmlControl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36583887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com