Прерванная функция расширения.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());
Другие вопросы по тегам