我正在升级 ASP.NET v3.5 Web 应用程序。到 v4,我在 XmlDataSource 对象上使用的 XSLT 转换遇到一些问题。
XSLT 文件的一部分:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:HttpUtility="ds:HttpUtility">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/Menus">
<MenuItems>
<xsl:call-template name="MenuListing" />
</MenuItems>
</xsl:template>
<xsl:template name="MenuListing">
<xsl:apply-templates select="Menu" />
</xsl:template>
<xsl:template match="Menu">
<MenuItem>
<xsl:attribute name="Text">
<xsl:value-of select="HttpUtility:HtmlEncode(MenuTitle)"/>
</xsl:attribute>
<xsl:attribute name="ToolTip">
<xsl:value-of select="MenuTitle"/>
</xsl:attribute>
</MenuItem>
</xsl:template>
</xsl:stylesheet>
问题似乎出在线上
<xsl:value-of select="HttpUtility:HtmlEncode(MenuTitle)"/>
删除它并用普通文本替换它,它就会起作用。我设置 XML 数据源的方式:
xmlDataSource.TransformArgumentList.AddExtensionObject("ds:HttpUtility", new System.Web.HttpUtility());
xmlDataSource.Data = Cache.FetchPageMenu();
我一直在 Microsoft 页面上搜索 v4 中的任何更改,但找不到任何更改。所有这些在 v3.5(以及 v2 之前)中都运行良好。没有收到任何错误,数据只是不显示。
问题似乎是 .NET 4.0 引入了额外的重载HttpUtility.HtmlEncode
。到 .NET 3.5 为止,存在以下重载:
public static string HtmlEncode(string s);
public static void HtmlEncode(string s, TextWriter output);
.NET 4.0还有以下方法:
public static string HtmlEncode(object value);
这导致XslTransformException
:
(方法调用不明确。扩展对象“ds:HttpUtility”包含多个具有 1 个参数的“HtmlEncode”方法。
您可能看不到异常,因为它是在某处捕获的并且没有立即报告。
使用 .NET Framework 类作为扩展对象是一件脆弱的事情,因为新的 Framework 版本可能会破坏您的转换。
解决方法是创建一个自定义包装类并将其用作扩展对象。此包装类可能没有具有相同数量参数的重载:
class ExtensionObject
{
public string HtmlEncode(string input)
{
return System.Web.HttpUtility.HtmlEncode(input);
}
}
//...
XsltArgumentList arguments = new XsltArgumentList();
arguments.AddExtensionObject("my:HttpUtility", new ExtensionObject());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)