asp.net使用名称空间前缀设置属性值。 (xlink:href on svg / use element)

时间:2018-04-16 21:26:37

标签: c# asp.net svg webforms xlink

我尝试使用svg元素在外部引用中将use放入我的页面中,如下所示:

<svg class="xyz" width="25px" height="25px" fill="red" xmlns:xlink="http://www.w3.org/1999/xlink">
    <use id="useLogo" runat=server class="xyz" href="~/Content/images/test.svg#shape" xlink:href="~/Content/images/test.svg#shape"></use>
</svg>

问题是我在用户控件中执行此操作,因此我需要引用相对于应用程序的svg文件,而不是用户控件所在的页面。

我决定使用~href属性中的xlink:href字符,然后使用page_load

protected void Page_Load(object sender, EventArgs e) {
    this.useLogo.Attributes["href"] = Page.ResolveUrl(this.useLogo.Attributes["href"]);
    //this.useLogo.Attributes["xlink:href"] = Page.ResolveUrl(this.useLogo.Attributes["xlink:href"]);
}

这确实有效,但为了向后兼容,我需要对xlink:href属性做同样的事情。由于元素的AttributeCollection没有该属性的项,因此名称空间似乎正在瘫痪ASP.Net。有没有办法识别命名空间属性,还是有完全不同的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您在浏览器中运行应用程序并查看来源,您会发现xlink:href已被删除,您的控件将呈现为:

<use id="MainContent_useLogo" class="xyz" href="~/Content/images/test.svg#shape"></use>

请注意,runat属性也缺失了。所有这些都是ASP引擎处理标签的结果,ASP引擎决定如何处理每个属性。

由于这两个属性已被删除,Attributes属性不包含这些属性,并且只包含classhref

由于您希望hrefxlink:href属性具有相同的值,因此您只需以编程方式添加xlink:href属性并将其设置为href的值即可属性:

useLogo.Attributes["href"] = ResolveUrl(this.useLogo.Attributes["href"]);
useLogo.Attributes.Add("xlink:href", useLogo.Attributes["href"]);