Прерванная функция расширения.net 4 xslt
Я нахожусь в процессе обновления веб-приложения asp.net v3.5. до v4, и я столкнулся с некоторыми проблемами с преобразованиями XSLT, которые я использую для объектов XmlDataSource.
Часть файла 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). Не получая ошибок, данные просто не отображаются.
1 ответ
Кажется, проблема в том, что.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" содержит несколько методов "HtmlEncode", которые имеют 1 параметр (ы).
Вы, вероятно, не видите исключения, потому что оно где-то поймано и не сразу сообщается.
Использование классов.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());