72 votes

Mise en œuvre d'une instruction de commutation dans une page CSHTML

J'essaie de faire quelque chose de différent. J'ai une vue qui contient un Id. En fonction de la valeur de l'Id, je veux modifier l'en-tête qui apparaît. Quelque chose comme :

@{ switch id
   case "test": @;<h1>Test Site</h1>
   case "prod": @:<h1>Prod Site</h1>
   break;
}

Je dispose d'un grand nombre de cas d'espèce et j'ai donc pensé qu'il serait préférable d'utiliser les cas d'espèce. Comment faire pour que cela fonctionne ? Je reçois beaucoup d'erreurs de syntaxe, donc je pense que ce n'est peut-être pas bien codé.

153voto

Joel Etherton Points 24155

Votre interrupteur doit être complètement enfermé dans un bloc et il doit être "cassé" correctement :

// Use the @{ } block and put all of your code in it
@{
    switch(id)
    {
        case "test":
            // Use the text block below to separate html elements from code
            <text>
                <h1>Test Site</h1>
            </text>
            break;  // Always break each case
        case "prod":
            <text>
                <h1>Prod Site</h1>
            </text>
            break;
        default:
            <text>
                <h1>WTF Site</h1>
            </text>
            break;                   
    }
}

Parce que la <h1> sont enfermées dans des blocs html, vous n'aurez peut-être pas besoin de la balise <text> blocs pour la séparation. J'ai pris l'habitude de les inclure.

11 votes

Il n'est pas nécessaire de placer l'ensemble de l'instruction switch dans un bloc @{}.

1 votes

Vous pouvez également vous débarrasser de la <text></text> . Elle n'est pas nécessaire si vous utilisez des balises html. Voir la réponse de @yoelhalb ci-dessous.

54voto

yo hal Points 1949
@switch (id)
{
    case "test": <h1>Test Site</h1>
    break;
    case "prod": <h1>Prod Site</h1>
    break;
}

Il n'est pas nécessaire d'inclure l'ensemble de l'instruction switch dans un @{} bloc, (contrairement au post de Joel Etherton)

Vos erreurs sont essentiellement des erreurs de syntaxe et n'ont rien à voir avec razor ;

  1. la variable n'était pas entre parenthèses

  2. le corps de l'interrupteur n'était pas entre parenthèses

  3. pas de "break" après la première déclaration.

3voto

McClint Points 81
@{
    String txt;
    switch (id) {
        case "test":
            txt = "Test";
            break;
        case "prod":
            txt = "Prod";
            break;
        default:
            txt = "WTF";
    }
}

<h1>@txt Site</h1>

Le plus concis : Moins de code et de balisage redondants ou répétitifs.

3voto

Kenny Evitt Points 1876

Cela ne répond pas à votre question, comme l'indique le titre de la question, mais cela résout le problème que vous avez décrit dans le corps de la question.

Utilisez une classe de modèle de vue comme modèle de la vue et ajoutez une méthode qui inclut l'élément switch déclaration. Il suffit ensuite d'appeler la méthode à partir de la vue via @Model.MethodWithSwitchStatement() . [Le id peuvent être sauvegardées dans l'objet modèle de vue].

0 votes

C'est la bonne façon de résoudre le problème décrit dans l'OP

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X