2010-09-16 9 views
3

Il s'agit d'une question de style et de conception plutôt que de syntaxe.Vérification Null excessive dans les vues MVC

J'ai des modèles de domaine qui ont plusieurs propriétés de navigation (à défaut d'un meilleur terme). Donc, dans mes détails fortement typées voir des Foo qui a une propriété de type Bar Je pouvais faire ce qui suit:

<%: Foo.Bar.Name %> 

Cependant, parfois Bar est nul, donc je me retrouve avec quelque chose comme:

<%: Foo.Bar == null ? String.Empty : Foo.Bar.Name %> 

Dans d'autres cas, parce que la commodité des propriétés de navigation I pourrait faire encore plus de chaînage. L'inconvénient, cependant, est l'introduction de vérification plus nulle dans ma vue. Comme alternative, je pourrais faire toutes les vérifications nuls dans un ViewModel de sorte que j'ai passé quelque chose "propre" à la vue. Je cherche des idées ou des directives de bon sens pour éviter les vérifications nulles excessives dans mes vues.

P.S. J'utilise ASP.NET MVC, mais je pense que cette question peut être pertinente pour d'autres frameworks MVC.

Répondre

3

Vous avez déjà répondu vous-même:

Comme alternative, je pouvais faire toutes les vérifications nul dans un ViewModel pour que je l'ai fait passer quelque chose « propre » à la vue.

Voilà, utilisez un ViewModel.

+0

Est-ce une bonne pratique? Serait-ce la seule raison d'utiliser un ViewModel, sinon mon modèle de domaine pur suffirait? – Larsenal

+0

@Larsenal alors qu'il existe d'autres raisons d'utiliser un ViewModel, une très bonne raison pour laquelle je les utilise est de garder le code hors des vues. Le scénario que vous avez publié est celui qui en bénéficie, mais vous verrez certainement plus de scénarios dans lesquels les vues peuvent avoir moins de vérifications conditionnelles en déplaçant le code vers les modèles de vue. – eglasius

+0

Une autre raison de l'utiliser est parce que c'est très efficace + simple en réduisant ce que vous autorisez à être posté sur vos contrôleurs. De plus, vous pouvez ajouter à asp.net certains attributs qui, autrement, seraient dans votre modèle original. Cela dit, dans les projets de très petite taille, je passe d'habitude entre l'utilisation de modèles et la visualisation de modèles, car parfois le modèle correspond à la facture. – eglasius

0

Créez une assistance qui vérifie null et renvoie une valeur par défaut appropriée.

Par exemple si vous avez un champ de numéro de téléphone, vous lui passez le champ et un PHONE constant. l'assistant vérifie si null et affiche "Aucun numéro de téléphone disponible" s'il est nul.

De cette façon, vous gardez toutes vos vérifications nuls en un seul endroit.

0

Une option utilise un assistant, comme décrit here.

+0

Ce lien montre seulement comment vérifier les chaînes nulles, la réponse dit même .. "Bien sûr, si c'est UserModified qui est nul et pas UserName alors vous aurez besoin d'une logique différente" –

0

Vous pouvez fournir une initialisation paresseuse pour vos propriétés de navigation dans votre modèle. De cette façon, vous pourriez minimiser le risque de rencontrer des valeurs nulles.

public class Foo 
{ 
    private Bar _bar; 

    public Bar Bar 
    { 
     get 
     { 
      if (_bar == null) 
      { 
       _bar = new Bar(); 
      } 
      return _bar; 
     } 
    } 
} 

public class Bar 
{ 
    public string Name { get; set; } 
} 
+0

Je pourrais certainement le faire, mais dans certains cas cas une valeur nulle est la valeur correcte. Rencontrer null simplement parce que je n'ai pas chargé la propriété est une préoccupation différente. – Larsenal

+0

C'est pourquoi vous devriez utiliser un modèle d'objet nul. Modélisez cette valeur nulle valide en tant que NullBar, puis ajoutez la logique pour gérer la nullité dans la classe NullBar pour ex. enregistrement, etc. –

1

Je ne sais pas si cela fait vraiment sens dans votre contexte, mais quand vous êtes dérangé par un excès de contrôles nuls, vous devriez envisager le modèle Null Object.

0

Considérons d'abord si dans votre modèle une instance de Foo est valide si Bar est null. Si non, vous devriez mettre une clause de garde dans le constructeur et/ou le setter de la propriété Bar. Deuxièmement, un trop grand nombre de vérifications nulles en double est une odeur de code. Vous devriez utiliser le refactoring Replace Conditional with Polymorphism. Vous pouvez créer un objet nul selon le Null Object Pattern. Assurez-vous ensuite que la propriété Bar est toujours initialisée avec NullBar.

public class Foo{ 

    public BarClass _bar; 

    public BarClass Bar{ 
     get{return _bar ?? new NullBar(); } 
     set{ _bar = value ?? new NullBar(); } 
    } 

     public Foo(){ 
      Bar = new NullBar(); // initialization 
     } 
    } 

Ensuite, la barre ne sera jamais nulle.

Questions connexes