Условная логика на странице ASP.net

У меня есть код, который печатает значения базы данных в элемент управления повторителя на странице asp.net. Однако некоторые возвращаемые значения имеют значение null / blank - и это приводит к тому, что результат выглядит безобразно при наличии пробелов.

Как вы делаете условную логику в элементах управления asp.net, то есть распечатываете значение, если оно существует, иначе просто переходите к следующему значению.

Я должен также добавить - что я хочу, чтобы разметка также была условной, как если бы не было значения, которое я тоже не хочу
теги.

Ниже приведен фрагмент кода, чтобы показать тип значений, которые я получаю из своей базы данных. (Обычно адрес 2 вообще не имеет значения).

<div id="results">
    <asp:Repeater ID="repeaterResults" runat="server">
        <ItemTemplate>
             Company:      <strong><%#Eval("CompanyName") %></strong><br />
             Contact Name: <strong><%#Eval("ContactName") %></strong><br />
             Address:      <strong><%#Eval("Address1")%></strong><br />                    
                           <strong><%#Eval("Address2")%></strong><br />..................

Большое спасибо

15.12.2008 12:07:09
5 ОТВЕТОВ
РЕШЕНИЕ

Это будет довольно субъективно, так как это полностью зависит от того, где и как вам нравится обрабатывать нулевые / пустые значения, и действительно, с каким из этих двух вы имеете дело.

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

В любом случае мой личный выбор состоял бы в том, чтобы убедиться, что вы отображаете, что для этого поля на уровне пользовательского интерфейса отсутствуют данные, чтобы избежать путаницы. В худшем случае что-то вроде:

<strong><% If (Eval("Address2").Length > 0) Then %><%#Eval("Address2")%><% Else %>No data available for Address 2<% End If %></strong><br />

Таким образом, по крайней мере, пользователь знает, что данные недоступны, а не знает, была ли какая-то системная / административная ошибка.

Надеюсь, это поможет :)

6
15.12.2008 12:32:01

Вы можете использовать IsDBNull (obj)

If IsDbNull(<%#Eval("Address2")%>) then
     etc
End If
1
15.12.2008 12:36:18
Это C #: хотя IsDbNull () доступен через пространство имен microsoft.visualbasic
Joel Coehoorn 15.12.2008 14:24:07

Есть несколько способов сделать это, я обычно использую событие повторителя OnItemDataBound, которое происходит, когда элемент повторителя привязан к элементу данных.

Чтобы объяснить событие OnItemDataBound, давайте предположим, что у нас есть повторитель с одним всегда отображаемым полем (Имя) и необязательным полем, которое отображается, если оно не равно нулю (Необязательно). Более того, мы хотим отобразить некоторое предопределенное значение, если необязательное поле пустое или пустое.
Для этого нам нужно сначала установить событие OnItemDataBound повторителя, чтобы оно указывало на метод, а также создать шаблон элемента повторителя. Мы могли бы использовать любой серверный элемент управления в шаблоне элемента повторителя, к которому мы можем обратиться позже в методе OnItemDataBound.

<asp:Repeater ID="repeaterResults" runat="server"   OnItemDataBound="repeaterResult_ItemDataDataBound">
    <ItemTemplate>
    <strong><%#Eval("Name") %></strong>
    <asp:Literal runat="server" ID="ltlOption" />
    <br />
    </ItemTemplate></asp:Repeater>

Далее, давайте предположим, что мы свяжем коллекцию простых объектов, которые имеют два свойства: Name и Option, как показано ниже:

public class SimpleEntity
{
    public string Name {get;set;}
    public string Option {get;set;}
}

Далее мы реализуем метод repeaterResult_ItemDataDataBound следующим образом:

protected void repeaterResult_ItemDataDataBound(object sender, RepeaterItemEventArgs e)
{
  SimpleEntity ent = e.Item.DataItem as SimpleEntity;
  Literal ltlOption = e.Item.FindControl("ltlOption") as Literal;
  if (ent != null && ltlOption != null)
  {
     if (!string.IsNullOrEmpty(ent.Option))
     {
        ltlOption.Text = ent.Option;
     }
     else
     {
        ltlOption.Text = "Not entered!";
     }

  }
}

Поскольку реализованный выше метод реализован, мы будем отображать необязательное поле, если оно существует, в то время как если необязательное поле имеет значение null или пустую строку, мы будем отображать предопределенную строку «Не введено!».

3
15.12.2008 12:38:19

Я предлагаю обернуть каждую пару ключ / значение в пользовательский элемент управления с двумя свойствами. Этот элемент управления будет отображаться только в том случае, если значение не пустое:

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ShowPair.ascx.cs" Inherits="MyWA.ShowPair" %>

<% if (!string.IsNullOrEmpty(Value))
   { %>
<%=Key %> : <%=Value %>
<% } %> 

А затем поместите элементы управления в шаблон повторителя:

<asp:Repeater runat='server' ID="repeater1">
     <ItemTemplate>
        <cst:ShowPair Key="Company Name:" Value="<%#((Company)Container.DataItem).CompanyName %>" runat="server"/>
        <cst:ShowPair Key="Contact Name:" Value="<%#((Company)Container.DataItem).ContactName %>" runat="server" />
        <cst:ShowPair Key="Address 1:" Value="<%#((Company)Container.DataItem).Address1 %>" runat="server" />
     </ItemTemplate>
    </asp:Repeater>
8
15.12.2008 13:56:59

Я понимаю, что это очень старый вопрос, но я хотел бы добавить, что, возможно, лучший способ решения этой проблемы - это больше на уровне базы данных, и да - я знаю, что OP не указал ни один тип источника данных ,

Я просто собираюсь предположить (да - задница нас с тобой), что текущий используемый язык - по крайней мере Transact SQL.

С этой целью я склонен использовать источник данных для создания составных полей. В случае адреса ISNULLуспешно проверят, какие поля используются, и вернут значение по умолчанию, если обнаружено поле NULL. Вдобавок к этому, символы (ы) разделителя могут быть включены, чтобы учесть разрывы строк в целевом выходном носителе. Одним из вариантов является использование запятой + один пробел в качестве разделителя ', '.

SELECT 
    ISNULL(src.address1 + ', ', '') +
    ISNULL(src.address2 + ', ', '') +
    ISNULL(src.address3 + ', ', '') +
    ISNULL(src.address4 + ', ', '') +
    ISNULL(src.postalcode, '') AS CompoundAddress
...

Это работает, используя NULLпротив себя - добавление к NULLвозвращает NULL, поэтому возвращаемое значение будет либо содержать нашу запятую + пробел, либо вернет пустую строку.

Нечто подобное можно сделать, чтобы «обмануть» Microsoft Access для создания вашего поля адреса ...

SELECT 
    (src.address1 + ', ') & 
    (src.address2 + ', ') & 
    (src.address3 + ', ') & 
    (src.address4 + ', ') & 
    (src.postalcode) As CompoundAddress
...

В этом случае амперсанд преобразует в NULLпустую строку, но то же самое относится и к добавлению строки в потенциально NULLполе.

Итак, теперь мы можем правильно вывести наш адрес в HTML ...

<div id="results">
    <asp:Repeater ID="repeaterResults" runat="server">
        <ItemTemplate>
            Company:      <strong><%#Eval("CompanyName") %></strong><br />
            Contact Name: <strong><%#Eval("ContactName") %></strong><br />
            Address:      <strong><%#Eval("CompoundAddress").ToString().Replace(", ", "<br />") %></strong><br />
0
20.02.2018 14:29:55