Я занимаюсь обновлением веб-приложения 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, но не могу их найти. Все это отлично работало в версии 3.5 (и до версии 2). Не получая никаких ошибок, данные просто не отображаются.
Проблема заключается в том, что .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());
MenuTitle
вы хотите закодировать?