Фильтрация на основе раскрывающегося списка в DVWP

Я создал раскрывающееся меню DVWP для фильтрации списка, который я показал с помощью DVWP. Я установил список лет в качестве раскрывающегося источника данных DVWP, и при выборе года я хочу отфильтровать список DVWP, чтобы отобразить элементы, отфильтрованные по году.

Раскрывающийся список:
<select name="ID" size="1" onchange="document.location.href='http://server/site.aspx' + '?' + 'year' + '=' + this.options[selectedIndex].value">.

Я добавил параметр QueryString param1, который принимает значение от Year в это раскрывающееся меню, а также в список DVWP. В список DVWP я добавил условие фильтра: Year equals [Param1]. Примечание. Год - это вычисляемый столбец, который получает год из поля даты.
Мой вопрос в том, что хотя раскрывающийся список возвращает сообщение после выбора значения, оно не фильтруется. Что я в этом сделал не так? Я ломал себе голову над этим, но я не могу заставить это работать, что бы я ни пытался. Пожалуйста помоги.

<xsl:template name="dvt_1">
            <xsl:variable name="dvt_StyleName">Table</xsl:variable>
            <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
            <xsl:variable name="dvt_FieldNameNoAtSign" select="substring-after($dvt_filterfield, '@')" />
            <xsl:variable name="dvt_FilteredRowsText" select="$Rows[.=$dvt_filterval or ($dvt_filtertype='date' and substring-before($dvt_filterval,'T') = substring-before(.,'T'))]" />
            <xsl:variable name="dvt_FilteredRows" select="$Rows[normalize-space(*[name()=$dvt_filterfield])=$dvt_filterval or ($dvt_filtertype='date' and substring-before($dvt_filterval,'T') = substring-before(normalize-space(*[name()=$dvt_filterfield]),'T'))]" />
            <xsl:variable name="dvt_FilteredRowsAttr" select="$Rows[normalize-space(@*[name()=$dvt_FieldNameNoAtSign])=$dvt_filterval or ($dvt_filtertype='date' and substring-before($dvt_filterval,'T') = substring-before(normalize-space(@*[name()=$dvt_FieldNameNoAtSign]),'T'))]" />
            <xsl:variable name="dvt_RowCount">
                <xsl:choose>
                    <xsl:when test="$dvt_adhocfiltermode != 'query' and $dvt_filterfield">
                        <xsl:choose>
                            <xsl:when test="starts-with($dvt_filterfield, '@')"><xsl:value-of select="count($dvt_FilteredRowsAttr)" /></xsl:when>
                            <xsl:when test="$dvt_filterfield = '.'"><xsl:value-of select="count($dvt_FilteredRowsText)" /></xsl:when>
                            <xsl:otherwise><xsl:value-of select="count($dvt_FilteredRows)" /></xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise><xsl:value-of select="count($Rows)" /></xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:variable name="RowLimit" select="10" />
            <xsl:variable name="FirstRow" select="$dvt_firstrow" />
            <xsl:variable name="LastRow">
                <xsl:choose>
                    <xsl:when test="($FirstRow + $RowLimit - 1) &gt; $dvt_RowCount"><xsl:value-of select="$dvt_RowCount" /></xsl:when>
                    <xsl:otherwise><xsl:value-of select="$FirstRow + $RowLimit - 1" /></xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:variable name="IsEmpty" select="$dvt_RowCount = 0 or $RowLimit = 0" />
            <xsl:variable name="dvt_IsEmpty" select="$dvt_RowCount = 0"/>
            <xsl:call-template name="dvt_1.toolbar">
                <xsl:with-param name="Rows" select="$Rows" />
            </xsl:call-template>
            <xsl:choose>
                <xsl:when test="$dvt_IsEmpty">
                    <xsl:call-template name="dvt_1.empty"/>
        </xsl:when>

Это то, что ты искал?

Умм, если это поможет, в списке, который я использую для заполнения раскрывающегося списка, поле «Год» имеет внутреннее имя @Title. Это как-то связано с этим?
<xsl:template name="dvt_1.rowview"> <option> <xsl:value-of select="@Title" /> </option> </xsl:template> . Но у него также есть @Year, так что не уверен, что есть что.
<td class="ms-vb"> <xsl:value-of select="@Year"/> </td>
Ой, извините за путаницу. 2-й @Year - это вычисляемый столбец, который я создал.
ОБНОВЛЕНИЕ 2: запрошенный код:

<td class="ms-toolbar" nowrap="nowrap">
                                <xsl:call-template name="dvt.filterfield">
                                    <xsl:with-param name="fieldname">@Year</xsl:with-param>

                                    <xsl:with-param name="fieldtitle">Year</xsl:with-param>

                                    <xsl:with-param name="Rows" select="$Rows" />

                                    <xsl:with-param name="fieldtype">text</xsl:with-param>

                                </xsl:call-template>

Что-то вроде этого было создано для обоих dvwp:
<xsl:param name="ListID">{6889CA36-79AC-4FA8-9F0A-C013C944B3C5}</xsl:param> <xsl:param name="Param1" />


person Akhoy    schedule 17.01.2013    source источник
comment
Если мой ответ ниже не помогает, в XSL для DVWP списка (а не в раскрывающемся списке) не могли бы вы найти шаблон с именем dvt_1 (<xsl:template name="dvt_1">) с кучей определений переменных в начале шаблона, и предоставить эти определения переменных здесь? В частности, я ищу одну под названием Rows, но, пожалуйста, предоставьте их несколько.   -  person JLRishe    schedule 17.01.2013
comment
Кроме того, не могли бы вы найти шаблон с именем dvt_1.rowview и указать его часть, включающую год? Примерно так: <td class="ms-vb" style="width: 112px"><xsl:value-of select="Year"/></td>. Я хочу дважды проверить фактическое имя, которое он использует для поля «Год». Есть вероятность, что эти шаблоны могут иметь суффикс _2 вместо _1, поскольку у вас есть 2 DVWP, поэтому, пожалуйста, следите за этим.   -  person JLRishe    schedule 17.01.2013
comment
Спасибо за добавление этого XSL. Не могли бы вы также предоставить часть, которую я просил во втором комментарии, от dvt_1.rowview? И еще одно - в начале XSLT для этого DVWP должна быть куча <xsl:param> элементов. Не могли бы вы их опубликовать?   -  person JLRishe    schedule 17.01.2013
comment
Когда я упомянул <xsl:param>, я имел в виду фактические xsl:param элементы, появляющиеся вскоре после строки xsl:stylesheet, а не xsl:with-param. Возможно, это было бы проще, если бы вы разместили все содержимое .aspx на codebin.org. Сможете ли вы это сделать, или в этом есть конфиденциальная информация?   -  person JLRishe    schedule 17.01.2013
comment
Здесь: codebin   -  person Akhoy    schedule 17.01.2013
comment
Глядя на это, <ParameterBinding Name="Param1" Location="QueryString(Year1)" DefaultValue=""/>, похоже, что Param1 привязан к параметру QueryString с именем «Year1», а не «Year». Не могли бы вы изменить этот тег <select> так, чтобы он содержал "? Year1" вместо "? Year"?   -  person JLRishe    schedule 17.01.2013
comment
После того как вы изменили тег <select>? Как это выглядит сейчас?   -  person JLRishe    schedule 17.01.2013
comment
Пробовал, не работает.   -  person Akhoy    schedule 17.01.2013
comment
Хорошо, последнее усилие, а затем я думаю, что мне нужно сдаться, пока у меня не будет возможности попробовать это сам. Не могли бы вы найти эту строку в списке DVWP <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/> и изменить ее на этот <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[@Year = $Param1]"/>, затем попробуйте тег <select> с Year1, Year и Param1 Чтобы посмотреть, работает ли какой-нибудь из них? Держу пальцы скрещенными.   -  person JLRishe    schedule 17.01.2013
comment
Нет, не работает. Спасибо, что нашли время помочь мне. Думаю, я найду другой способ сделать это.   -  person Akhoy    schedule 17.01.2013


Ответы (2)


Я только что заметил (благодаря моему коллеге), что Year, который является вычисляемым столбцом, представляет собой строку. Итак, на 2013 год он хранил его как 2013, из-за чего я не мог правильно отфильтровать DVWP. Я использовал =TEXT(([columnname], "yyyy") вместо YEAR([colname]), и все работало нормально.

person Akhoy    schedule 23.01.2013

Если имя вашего параметра называется param1, то я считаю, что в раскрывающемся списке нужно будет передать параметр строки запроса с именем «param1» в URL-адрес вместо «год». Не могли бы вы изменить этот тег select, чтобы он выглядел так ?:

<select name="ID" size="1"
  onchange="document.location.href='http://server/site.aspx?param1=' 
  + this.options[selectedIndex].value">
person JLRishe    schedule 17.01.2013
comment
Нет, не работает. Что меня смущает, так это то, что у меня на странице 2 DVWP, и поскольку я использую другой список для DVWP, я не могу использовать параметр фильтра или поля списка в другом DVWP. Большинство руководств, которым я следил, имеют дело только с 1 DVWP на странице. - person Akhoy; 17.01.2013
comment
Спасибо за вашу помощь. Я только что заметил (спасибо моему коллеге), что Year, который является вычисляемым столбцом, представляет собой строку. Итак, на 2013 год он хранил его как 2013, из-за чего я не мог правильно отфильтровать DVWP. Я использовал =TEXT(([columnname], "yyyy") вместо YEAR([colname]), и все работало нормально. - person Akhoy; 17.01.2013
comment
Отлично. Спасибо за ответ. Итак, каково было окончательное значение тега <select>, и действительно ли <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/> не нужно было изменять? - person JLRishe; 17.01.2013
comment
Значение тега <select> такое же, как я опубликовал ранее. <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/> на самом деле не нужно было модифицировать, но он сыграл большую роль в отладке DVWP. Так что спасибо и за это. Просто уловка с фильтром OOB сработала. :) - person Akhoy; 17.01.2013