2008-12-15 7 views
8

Mam pewien kod, który wypisuje wartości databse do kontrolki przemiennika na stronie asp.net. Jednak niektóre zwrócone wartości mają wartość zerową/pustą - a to sprawia, że ​​wynik wygląda brzydko, gdy są puste miejsca.Logika warunkowa w ASP.net strona

W jaki sposób wykonujesz logikę warunkową w kontrolkach asp.net, np. Wypisujesz wartość, jeśli taka istnieje, inaczej po prostu przejdź do następnej wartości.

Powinienem również dodać - że chcę, aby znacznik był również warunkowy, tak jakby nie było żadnej wartości, której nie chcę, aby tag był albo
.

Oto fragment kodu poniżej, aby wyświetlić typ wartości, które otrzymuję z mojej bazy danych. (Często zdarza się, że adres Adres 2 nie ma żadnej wartości).

<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 />.................. 

Dziękujemy

Odpowiedz

6

To będzie bardzo subiektywna to jako całkowicie zależy od tego gdzie i jak chcesz obsługiwać/null wartości puste i rzeczywiście których jedna z tych dwóch masz do czynienia z .

Na przykład niektórzy lubią obchodzić się z wartościami zerowymi na poziomie bazy danych, niektórzy lubią kodować wartości domyślne w warstwie logiki biznesowej, a inni chcą obsługiwać wartości domyślne/puste w interfejsie użytkownika - nie wspominając o mnogości opcji pomiędzy .

Tak czy inaczej, moim osobistym wyborem jest upewnienie się, że w celu uniknięcia nieporozumień dane nie są dostępne dla tego pola na poziomie interfejsu użytkownika. W najgorszym coś wzdłuż linii:

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

ten sposób co najmniej użytkownik wie, że żadne dane nie są dostępne, a nie wiedząc, czy nie doszło do jakiś system/błąd administracyjny.

nadzieję, że pomoże :)

1

Można użyć IsDBNull (obj)

If IsDbNull(<%#Eval("Address2")%>) then 
    etc 
End If 
+0

Jest to C#: chociaż IsDbNull() jest dostępna za pośrednictwem microsoft.visualbasic nazw –

+0

więc używać == DBNull.Value –

3

Istnieją może sposoby aby to zrobić, ja zwykle przy użyciu zdarzenie Repeater za OnItemDataBound zdarzenie, które występuje, gdy pozycja Repeater jest związany z elementem danych.

Aby wyjaśnić zdarzenie OnItemDataBound, załóżmy, że mamy repeater z jednym polem, które jest zawsze wyświetlane (Name) i opcjonalnym polem, które jest wyświetlane, jeśli nie jest puste (Opcjonalnie). Co więcej, chcemy wyświetlić pewną predefiniowaną wartość, jeśli pole opcjonalne jest puste lub puste.
Aby to zrobić, musimy najpierw ustawić zdarzenie OnItemDataBound wzmacniacza, aby wskazywało na metodę, A także aby zbudować szablon elementu przemiennika. Możemy użyć dowolnego kontrolera serwera w szablonie pozycji wzmacniacza, do którego możemy się odwołać później w metodzie 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> 

Ponadto załóżmy, że będziemy wiązać zbiór prostych obiektów, które mają dwie właściwości: imię i Opcji jak następuje:

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

Następny będziemy realizować metodę repeaterResult_ItemDataDataBound następująco:

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!"; 
    } 

    } 
} 

Zgodnie z powyższą metodą, zostanie wyświetlone pole opcjonalne, jeśli istnieje, natomiast jeśli pole opcjonalne jest puste lub puste, wyświetlimy predefiniowane d ciąg "Nie wpisano!".

8

Proponuję owijać każdą parę klucz/wartość w formant niestandardowy z 2 właściwościami. Kontrola ta wyświetli się tylko wtedy, gdy wartość nie jest pusty:

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

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

a następnie umieścić w kontroli repeater Szablon:

<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> 
0

Zdaję sobie sprawę, że jest to bardzo stare pytanie, ale chciałbym dodać, że prawdopodobnie najlepszym sposobem rozwiązania tego problemu jest bardziej na poziomie bazy danych, i tak - wiem, że OP nie określił żadnego rodzaju źródła danych.

Po prostu przyjmiemy (tak, osioł ciebie i mnie), że obecny język jest przynajmniej Transact SQL.

W tym celu staram się używać źródła danych do tworzenia pól złożonych. W przypadku adresu ISNULL z przyjemnością przetestujemy, aby zobaczyć, które pola są w użyciu, i zwracamy wartość domyślną, jeśli napotkane zostanie pole NULL. Oprócz tego można dołączyć znak (y) separatora, aby umożliwić podział linii na docelowym medium wyjściowym. Jedną z opcji jest użycie przecinka i jednej spacji jako ogranicznika ', '.

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

Działa to za pomocą NULL przeciwko sobie - dodanie do NULLNULL zwraca zatem wartość zwracana albo będzie zawierać nasz przecinek + spacja lub zwróci pusty ciąg.

Coś podobnego można zrobić, by „sztuczki” Microsoft Access do produkcji swoje pole adresu ...

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

W tym przypadku ampersand przekonwertuje NULL na pusty ciąg znaków, ale nadal to samo dotyczy dodanie ciągu do pola potencjalnie NULL.

Więc teraz, możemy wyjście nasz adres prawidłowo w 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 />