Условная логика на странице ASP.net - PullRequest
8 голосов
/ 15 декабря 2008

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

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

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

Ниже приведен фрагмент кода, показывающий тип значений, которые я получаю из своей базы данных. (Обычно Address 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 />..................

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

Ответы [ 5 ]

8 голосов
/ 15 декабря 2008

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

 <%@ 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>
6 голосов
/ 15 декабря 2008

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

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

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

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

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

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

3 голосов
/ 15 декабря 2008

Могут быть способы сделать это, я обычно использую событие повторителя 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 или пустую строку, мы будем отображать предопределенную строку «Not notхватка!».

1 голос
/ 15 декабря 2008

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

If IsDbNull(<%#Eval("Address2")%>) then
     etc
End If
0 голосов
/ 20 февраля 2018

Я понимаю, что это очень старый вопрос, но я хотел бы добавить, что, возможно, лучший способ решения этой проблемы - это больше на уровне базы данных, и да - я знаю, что в 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 />
...