8
votes

Élégant foreach - d'autre construire dans le rasoir

Beaucoup de moteurs de modèles ont un type spécial de syntaxe une combinaison de foreach code> et sinon code>. Fondamentalement, la clause ele code> est exécutée lorsque la boucle foreach code> n'a pas d'itérations. Cela peut être utile si vous souhaitez afficher une sorte de aucun élément de la liste em> de repli.

dans Brindille par exemple, le pour code> boucle peut ressembler à ceci p> xxx pré>

à l'aide du moteur de visualisation de rasoir, le modèle aimerait comme ceci, impliquant une vérification supplémentaire sur le nombre d'éléments de la collection: P>

@foreach (var user in users) {
    <li>@user.UserName</li>
}
@if (!users.Any()) {
    <li><em>no user found</em></li>
}


0 commentaires

4 Réponses :


2
votes

La seule façon dont je pouvais penser à atteindre quelque chose comme celui-ci est avec quelques extensions à iEnumerable : xxx

Cela vous permet de chaîner 2 Appels les uns sur les autres comme démonstarté par cet exemple en direct: http://rexter.com/runcode?code=AEBQ75190 < / a> qui utilise le code suivant: xxx

Comment cela s'intégrerait avec un modèle de rasoir, je suis toujours incertain de ... Mais peut-être que cela vous donne quelque chose à aller sur.


0 commentaires

1
votes

Rien de construit en Afaik, mais vous pourriez probablement étendre ceci en fonction de vos besoins:

http://haacked.com/ Archive / 2011/04/14 / A-meilleur-rasoir-foreach-loop.aspx

Je pourrais être capable d'aider plus tard lorsque je n'utilise pas mon téléphone si vous n'avez toujours pas de réponse


1 commentaires

Je pense que si vous combinez cela avec la réponse de Jamiec, vous aurez une solution!



9
votes

Consolidation des réponses de Jamiec et de Martin Booth. J'ai créé la méthode d'extension suivante. Il faut un premier argument iéalable, puis deux délégués pour rendre le texte. Dans les vues de rasoir, nous pouvons transmettre les délégués modèles em> deux ces paramètres. En bref, cela signifie que vous pouvez donner des modèles. Voici donc la méthode d'extension et comment vous pouvez l'appeler:

@(Model.Users
   .Each(@<li>@item.Name</li>)
   .Else(
        @<li>
            <b>No Users</b>
         </li>
        )
)


6 commentaires

La virgule est proche invisible. : P


Je suis d'accord, mais il n'y a pas de vraie façon que nous puissions contourner cela, pouvons-nous? :)


Si vous utilisez un paramètre nommé pour la clause d'équipe, il est probablement encore plus lisible et vous pouvez le rendre facultatif


Je pense que vous pourriez tirer de helperresult ou à partir de ihtmlstring et créez un .else () méthode de la mesure similaire. Donc, vous écririez: @ modèles.utilisateurs.ach (@

  • item.name.name ). Sinon (@
  • Aucun article )


    Mieux encore, renvoyez une classe personnalisée du pour chaque méthode d'extension qui implémente ihtmlstring, mais cela signifie que la méthode d'autre s'applique uniquement à cette classe personnalisée (c.-à-d. Pas d'iNeumable)


    +1 - bonne réponse. Je savais qu'il y avait un moyen de construire sur ce que j'avais commencé, je ne connaissais pas les délégués modèles pour Razor.



  • 0
    votes

    Peut-être que cela n'était peut-être pas possible lorsque la question a été posée, mais je viens de réaliser cela comme celui-ci:

    @if (Model.EmailAddress.Count() > 0)
    {
        foreach (var emailAddress in Model.EmailAddress)
        {
            <div>@emailAddress.EmailAddress</div>
        }
    } else { <span>No email addresses to display</span>  }
    


    0 commentaires