2010-02-22 7 views
1

Compte tenu du bloc de code simplifié suivant dans ASP.NETComment gérer un objet nul dans un bloc de code ASP.NET

<% foreach(item in Model) { %> 

    <%=item.OriginalText.OriginalText1 %> 
<%} %> 

Originaltext est une classe qui peut être nulle. Je suis à la recherche d'un moyen simple (propre) pour vérifier cette null et retourner une chaîne vide ("") à la place.

Répondre

9
<% foreach(item in Model) { %> 

    <%= (item.OriginalText == null) ? string.Empty: item.OriginalText.OriginalText1 %> 
<%} %> 
+3

+1 pour l'utilisation de 'String.Empty' au lieu de" ". –

+0

Pourquoi utiliser string.empty est meilleur que ""? –

+5

chaîne.Empty ne crée pas d'objet pendant que "" crée un objet chaîne. L'utilisation de string.Empty est donc préférable à l'utilisation de "" car chaque fois que vous utilisez "", elle crée une nouvelle chaîne tandis que string.Empty référence simplement une chaîne en mémoire créée par défaut. – Brettski

2

utilisation celle-ci:

<%=item.OriginalText == null ? "" : item.OriginalText.OriginalText1 %> 
+0

Oui, c'était ma première pensée, je me demandais juste s'il y avait quelque chose d'autre disponible. Merci pour votre réponse. – Brettski

0

La façon plus propre que je l'ai trouvé pour ce faire est avec une méthode d'extension.

Exemple:

public static class OriginalTextExtensions 
{ 
    public static string OriginalText1SafeString(this OriginalText original) 
    { 
     return original == null ? string.Empty : original.OriginalText1; 
    } 
} 

et vous souhaitez l'utiliser comme ceci:

<% foreach(item in Model) { %> 

    <%= item.OriginalText.OriginalText1SafeString() %> 

<%} %> 
0
<% foreach(item in Model) { %> 

    <%= item.OriginalText == null ? string.Empty: 
            item.OriginalText.OriginalText1 %> 
<%} %> 
+0

-1: en quoi cela diffère-t-il de la réponse de Preet Sangha? –

+0

Auteur utilise en question 'item.OriginalText.OriginalText1'. Preet Sangha utilise en réponse 'item.OriginalText1'. J'utilise dans ma réponse la variante de l'auteur. – AndreyAkinshin

+0

Merci pour cela. –

1

Si vous êtes dans le contrôle du code, vous pouvez aussi envisager la mise en œuvre du null object pattern, évitant ainsi la nécessité de vérifier null. L'avantage de cette approche est que vous n'avez plus besoin de vérifier chaque fois que vous voulez utiliser l'objet (Ne vous répétez pas), mais cela dépend de la manière dont vous créez vos objets et de la façon dont vous contrôlez avoir.

Quelque chose comme:

public class NullOriginalText : OriginalText 
{ 
    public string OriginalText1 { get; private set; } 

    public NullOriginalText() 
    { 
     OriginalText1 = string.Empty; 
    } 
} 

public class ModelItem 
{ 
    public OriginalText { get; private set; } 

    public ModelItem() 
    { 
     OriginalText = new NullOriginalText(); 
    } 

    public ModelItem(OriginalText originalText) 
    { 
     if (originalText == null) 
     { 
      OriginalText = new NullOriginalText(); 
     } 
     else 
     { 
      OriginalText = originalText; 
     } 
    } 
} 
+0

Si, c'est assez proche de la dernière approche que j'ai utilisée. Je vérifie l'objet nul dans le modèle et crée un nouvel objet vide s'il est nul. Je suppose que plus je regardais cela, il n'a pas de sens de vérifier cela encore et encore au niveau de la vue.Cela n'appartient tout simplement pas ici. – Brettski

0

En fonction de la situation, le Null coalescing operator peut aider aussi.

<% foreach(item in Model) { %> 
    <%= item.OriginalText.OriginalText1 ?? String.Empty %> 
<%} %> 
+0

Au début, j'ai pensé que c'était ce que je cherchais. Il semblait juste et impossible à rechercher. Cependant, le vrai problème est que ça ne marchera pas. OriginalText est l'objet null, et en essayant de vérifier null sur OriginalText.OriginalText1 lève une exception NullReferenceException. Cela fonctionnerait si OriginalText n'est pas null et OriginalText1 était l'objet null. Pour vérifier correctement cela, ce qui n'a pas de sens est: <% = item.OriginalText ?? String.Empty%> – Brettski

+0

-1 car cela ne fonctionne pas. – Brettski

+0

C'est pourquoi j'ai dit que cela dépend de la situation. Bien que cela ne fonctionne pas dans votre situation, l'information est bonne. – mark123

Questions connexes