Как скрыть элементы, когда поле smartform имеет значение null

У меня есть панель предупреждений, которая получает текст от смарт-формы. Я пытаюсь настроить это так, чтобы когда поле smartform "Alert" было пустым, тогда панель предупреждений будет скрыта. Вот мой код:

<div runat="server" ID="alertBox"  class="alert alert-danger">
    <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
       <center>
           <CMS:ContentBlock ID="alert" runat="server" Visible="true" DisplayXslt="/xmlfiles/Alert.xslt" DefaultContentID="2147499035" CssClass="text" />
    </center>
</div>

Вот мой код для этого до сих пор:

   XmlDocument al = new XmlDocument();
    if (al.SelectSingleNode("/root/Alert") != null)
    {
        alertBox.Visible = false;
    }
    else
    {
        alertBox.Visible = true;
    }

1 ответ

Решение

Давайте начнем с того, что убедитесь, что ваш XmlDocument ссылается на smartform xml из элемента управления вашего блока контента.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(alert.EkItem.Html);

С этим путем, вот как я бы проверил, чтобы убедиться, что (а) узел существует и (б) узел содержит текст.

string alertContent;

// If dealing with a plain-text field...
var txtAlertNode = xmlDoc.SelectSingleNode("/root/txtAlert");
alertContent = txtAlertNode?.InnerText;
if (string.IsNullOrWhiteSpace(alertContent))
{
    Console.WriteLine("No txtAlert content.");
    // alertBox.Visible = false;
}
else
{
    Console.WriteLine("ALERT: " + alertContent);
    // alertBox.Visible = true;
}

// If dealing with a rich-text field...
var rtfAlertNode = xmlDoc.SelectSingleNode("/root/rtfAlert");
if (string.IsNullOrWhiteSpace(rtfAlertNode?.InnerText))
{
    Console.WriteLine("No rtfAlert content.");
    // alertBox.Visible = false;
}
else
{
    alertContent = rtfAlertNode.InnerXml;
    Console.WriteLine("ALERT: " + alertContent);
    // alertBox.Visible = true;
}

Но так как у вас есть блок управления содержимым, отображающий фактическое содержимое оповещения, вы можете получить что-то подобное.

var alertNode = xmlDoc.SelectSingleNode("/root/Alert");
if (string.IsNullOrWhiteSpace(alertNode?.InnerText))
{
    alertBox.Visible = false;
}
else
{
    alertBox.Visible = true;
}

В Ektron SmartForms есть возможность сделать поле необязательным, поэтому возможно, что /root/Alert узел будет нулевым. Но также возможно, что узел будет существовать в xml и просто не иметь никакого контента. Если оно сконфигурировано как поле расширенного текста, тогда может быть трудно полностью очистить HTML поля - часто вы получаете xml, который выглядит следующим образом:

<root>
    <Alert>
        <p></p>
    </Alert>
</root>

Вот почему я тестирую InnerText свойство узла. Я использую Null-условный оператор ?. учитывать тот факт, что сам узел может быть нулевым. Если ваш сайт Ektron не использует более новые функции языка C# (я знаю, нулевые условия существуют уже несколько лет), то вам придется проверять наличие нуля отдельно.

var alertNode = xmlDoc.SelectSingleNode("/root/Alert");
if (alertNode != null && string.IsNullOrWhiteSpace(alertNode.InnerText))
{
    alertBox.Visible = false;
}
else
{
    alertBox.Visible = true;
}

Я хотел бы предложить альтернативу, если можно. Из вашего кода я вижу, что вы уже используете XSLT для отображения содержимого предупреждения. Вы могли бы переместить разметку alertBox разделитесь на ваш XSLT и выполните там тест "null-or-empty". Тогда вам не понадобится какой-либо код для этой конкретной функции.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">

    <xsl:call-template name="alertBox">
      <xsl:with-param name="content" select="root/txtAlert/text()"/>
    </xsl:call-template>

    <xsl:call-template name="alertBox">
      <xsl:with-param name="content" select="root/rtfAlert/node()"/>
    </xsl:call-template>

  </xsl:template>

  <xsl:template name="alertBox">
    <xsl:param name="content"/>
    <xsl:if test="$content and (string-length(translate(normalize-space($content/text()), ' ', '')) &gt; 0 or string-length(translate(normalize-space($content), ' ', '')) &gt; 0)">
      <div runat="server" ID="alertBox"  class="alert alert-danger">
        <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
        <center>
          <xsl:copy-of select="$content"/>
        </center>
      </div>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание, что alertBox Шаблон в этом XSLT будет работать как для обычного, так и для расширенного текстовых полей. Он использует copy-of чтобы отобразить все, что передано, поэтому при вызове шаблона необходимо соблюдать осторожность, чтобы передать либо text() (простой текст) или node() (html/rich-text) элемента в соответствии с его типом.

Другие вопросы по тегам