Прерванная функция расширения .net 4 xslt - PullRequest
2 голосов
/ 05 августа 2010

Я в процессе обновления веб-приложения asp.net v3.5.до версии 4, и у меня возникают некоторые проблемы с преобразованиями 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 Ответ

5 голосов
/ 05 августа 2010

Кажется, проблема в том, что .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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...