Razor ne comprend pas les balises HTML non fermées

99

Avec RazorViewEngine, je peux faire ceci:

if (somecondition) {
     <div> some stuff </div>
}

mais je n'arrive pas à faire ça (Razor est confus):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

J'ai une situation dans laquelle je dois placer mes balises html d'ouverture et de fermeture dans différents blocs de code - comment puis-je faire cela dans Razor?

Sydneyos
la source

Réponses:

161

Essayez comme ceci:

if (somecondition) {
    @:<div>
}
Darin Dimitrov
la source
1
ou <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver
17
<text><div></text>fonctionne, mais <text></div></text>ne fonctionne pas.
friggle
@Stuntman vous devez le faire pour les balises d'ouverture et de fermeture pour que cela fonctionne.
Departamento B
et comment traiter le texte multiligne?
Dmitri Tsoy
Je ne pouvais pas faire ça en ligne. if (condition) {@: tag}. J'ai dû le formater comme ci-dessus.
Mike
59

Pour expliquer la réponse de Darin, c'est-à-dire en préfixant le HTML comme ceci:

@:<html>

@: dans Razor signifie `` rendre quelque chose sous forme de texte brut ''

ou vous pouvez utiliser ceci, qui génère le HTML tel que vous l'avez écrit initialement (cela peut également être utilisé pour éviter le codage HTML automatique que Razor fait si vous essayez de générer du HTML):

@Html.Raw("<html>")

(Référence Html.Raw de MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )

Chris Halcrow
la source
2
les solutions sont excellentes, mais les explications sont inestimables. Merci!
jay
2
Je préfère la solution @ Html.Raw ("<html>"), car la première a été divisée sur multiligne lors de l'utilisation du formatage automatique (ctrl + K ctrl + D)
Matteo Sganzetta
@MatteoSganzetta Vrai à moins que ce que vous produisez ne comporte des variables Razor, par exemple:@:<a href="@link" class="@classNames">@text</a>
qJake
Soyez prudent en utilisant @Html.Raw()- voir l'article SO associé
SliverNinja - MSFT
4

Vous pouvez créer une méthode MVC Helper personnalisée. Pour avec vous créez une classe publique statique MyRenderHelpers dans l'espace de noms System.Web.Mvc.Htmlet écrivez une méthode Html.

namespace System.Web.Mvc.Html
{
    public static class MyRenderHelpers
    {
        public static MvcHtmlString Html(this HtmlHelper helper, string html, bool condition)
        {
            if (condition)
                return MvcHtmlString.Create(html);
            else
                return MvcHtmlString.Empty;
        }
    }
}

Vous pouvez maintenant utiliser cette méthode d'extension dans votre vue rasoir:

@Html.Html("<div>", somecondition)
Thomas Hauser
la source
3

Le fait que vous deviez faire cela indique généralement que votre code de vue n'est pas pris en compte correctement. La nature du HTML est d'avoir des balises équilibrées ou auto-incluses (au moins en HTML 4, HTML 5 semble s'en éloigner) et Razor dépend de cette hypothèse. Si vous allez à une sortie conditionnelle, <div>vous obtiendrez également une sortie quelque part plus tard </div>. Mettez simplement la paire whoel dans votre ifdéclaration:

@if(something) {
    <div>
        Other stuff
    </div>
}

Sinon, vous vous retrouvez avec un code bizarre comme ici .

Marcind
la source
6
Ma situation est que je veux
sydneyos
Bon, je veux dire que dans 99% des cas, vous ne devriez probablement pas. Mais vous pourriez entrer dans ce 1%, auquel cas il y a @:ou<text></text>
marcind
7
il a probablement un bloc de fermeture plus tard:if (somecondition) { @:</div> }
Simon_Weaver
oui, il le doit. mon point est que de telles vues peuvent être remodelées de sorte que ces doubles conditions ne soient pas nécessaires.
marcind
1
@michielvoo Pourquoi est-il mauvais d'utiliser cette méthode pour avoir un wrapper div conditionnel par exemple? De plus, en HTML5, vous ne fermez pas les <link>balises.
Chris Haines