2008-12-15 5 views
8

J'ai du code qui imprime des valeurs de base de données dans un contrôle de répéteur sur une page asp.net. Cependant, certaines des valeurs renvoyées sont null/blank - et cela rend le résultat moche quand il y a des espaces vides.Logique conditionnelle dans ASP.net page

Comment faire une logique conditionnelle dans les contrôles asp.net, c'est-à-dire imprimer une valeur si elle existe, sinon passer à la valeur suivante.

Je devrais également ajouter - que je veux que le balisage soit aussi conditionnel, comme s'il n'y a aucune valeur je ne veux pas non plus une balise
.

Voici un extrait de code ci-dessous juste pour montrer le type de valeurs que je récupère de ma base de données. (Il est commun pour Adresse 2 pour ne pas avoir une valeur du tout).

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

Un grand merci

Répondre

6

Il va être un assez subjectif qu'il en dépend complètement où et comment vous voulez gérer les valeurs NULL/blanc, et en effet que l'un des deux vous faites affaire avec . Par exemple, certains aiment gérer les valeurs nulles au niveau de la base de données, d'autres préfèrent coder les valeurs par défaut dans la couche logique métier et d'autres préfèrent gérer les valeurs par défaut/vides à l'interface utilisateur, sans parler de la pléthore d'options . Dans les deux cas, mon choix personnel serait de m'assurer qu'aucune donnée n'était disponible pour ce champ au niveau de l'interface utilisateur afin d'éviter toute confusion. Au pire chose le long des lignes de:

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

De cette façon, au moins l'utilisateur sait qu'aucune donnée ne soit disponible, plutôt que de ne pas savoir s'il y a eu un système/erreur administrative.

Hope qui aide :)

1

Vous pouvez utiliser IsDBNull (obj)

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

C'est C#: si IsDBNull() est disponible via l'espace de noms Microsoft.VisualBasic –

+0

utiliser si == DBNull.Value –

3

Il peut façons de le faire, j'utilise habituellement l'événement de répétition événement OnItemDataBound qui se produit lorsque l'élément de répéteur est lié à un élément de données.

Pour expliquer l'événement OnItemDataBound supposons que nous avons un répéteur avec un champ toujours affiché (Name) et un champ facultatif qui est affiché si null (facultatif). De plus, nous voulons afficher une valeur prédéfinie si le champ optionnel est nul ou vide.
Pour ce faire, nous devons d'abord définir l'événement OnItemDataBound du répéteur pour qu'il pointe vers une méthode, et également pour générer le modèle d'élément du répéteur. Nous pourrions utiliser n'importe quel contrôle serveur dans le modèle d'élément de répéteur que nous pouvons référencer plus tard dans la méthode 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> 

De plus, nous allons supposer que nous allons lier une collection d'objets simples qui ont des deux propriétés: Nom et option comme suit:

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

prochaine, nous allons mettre en œuvre la méthode repeaterResult_ItemDataDataBound comme suit:

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

    } 
} 

Comme la méthode ci-dessus est implémentée, nous afficherons un champ facultatif s'il existe, alors que si un champ optionnel est une chaîne vide ou vide, nous afficherons une prédéfinition d chaîne "Non entré!".

8

Je suggère d'envelopper chaque paire clé/valeur dans un contrôle personnalisé avec 2 propriétés. Ce contrôle s'affiche seulement si la valeur est pas vide:

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

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

Et puis mettre des contrôles en modèle de répéteur:

<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

Je me rends compte que cela est une question très ancienne, mais je voudrais ajouter que peut-être la meilleure façon de traiter ce problème est plus au niveau de la base de données, et oui - je sais que le PO n'a spécifié aucun type de source de données.

Je vais simplement supposer (oui - cul de vous et moi) que la langue courante utilisée est au moins Transact SQL. Pour ce faire, j'ai tendance à utiliser la source de données pour produire des champs composés. Dans le cas d'une adresse ISNULL sera heureusement tester pour voir quels champs sont utilisés, et retourner une valeur par défaut si un champ NULL est rencontré. En plus de cela, un caractère de séparation peut être inclus pour permettre des sauts de ligne dans le support de sortie cible. Une option consiste à utiliser une virgule + un espace comme délimiteur ', '.

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

Cela fonctionne à l'aide NULL contre lui-même - en ajoutant à NULL renvoie une NULL, par conséquent, la valeur retournée sera soit contenir notre virgule + espace ou il retournera une chaîne vide.

Quelque chose de semblable peut être fait pour « truc » Microsoft Access dans la production de votre champ d'adresse ...

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

Dans ce cas, l'esperluette convertit le NULL à une chaîne vide, mais le même applique encore l'ajout de la chaîne au champ potentiellement NULL.

Alors maintenant, nous pouvons sortie notre adresse correctement dans le code 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 /> 
Questions connexes