2010-11-10 11 views
5

Je voudrais penser que c'est évident, mais avant de soumettre un rapport de bug, je veux savoir que je ne me trompe pas. J'ai ce point de vue en utilisant ASP.NET MVC3 RC, avec Razor:MVC Razor 3 RC syntaxe: Bug ou erreur de l'utilisateur?

<div class="miniProfile"> 
    Joined: @FormatTime(Model.Joined)<br /> 
    @if (!String.IsNullOrWhiteSpace(Model.Location)) { 
     Location: @Model.Location<br /> 
    } 
    Posts: @Model.PostCount<br /> 
    @Html.ActionLink("Full Profile", "ViewProfile", new { id = Model.UserID }, new { target = "_blank" }) | 
    @Html.ActionLink("Send Private Message", "SendNew", "PrivateMessages", new { id = Model.UserID }) | 
    @Html.ActionLink("Send E-mail", "Send", "Email", new { id = Model.UserID }) 
    @if (!String.IsNullOrWhiteSpace(Model.Web)) { 
     | <a href="@Model.Web" target="_blank">Visit user Web site: @Model.Web</a> 
    } 
</div> 

Il étrangle à « emplacement » et à la conduite dans le dernier conditionnelle. Si j'insère quelques <texte> balises, cela fonctionne comme ceci:

<div class="miniProfile"> 
    Joined: @FormatTime(Model.Joined)<br /> 
    @if (!String.IsNullOrWhiteSpace(Model.Location)) { 
     <text>Location: </text>@Model.Location<br /> 
    } 
    Posts: @Model.PostCount<br /> 
    @Html.ActionLink("Full Profile", "ViewProfile", new { id = Model.UserID }, new { target = "_blank" }) | 
    @Html.ActionLink("Send Private Message", "SendNew", "PrivateMessages", new { id = Model.UserID }) | 
    @Html.ActionLink("Send E-mail", "Send", "Email", new { id = Model.UserID }) 
    @if (!String.IsNullOrWhiteSpace(Model.Web)) { 
     <text>| </text><a href="@Model.Web" target="_blank">Visit user Web site: @Model.Web</a> 
    } 
</div> 

Malgré quelques essais et erreurs, je ne peux pas comprendre ce que je fais qui est méchant. Suggestions?

Répondre

7

Votre balisage devrait être comme suit

<div class="miniProfile"> 
    Joined: @FormatTime(Model.Joined)<br /> 
    @if (!String.IsNullOrWhiteSpace(Model.Location)) { 
    <text>Location: @Model.Location<br /></text> 
    } 
    Posts: @Model.PostCount<br /> 
    @Html.ActionLink("Full Profile", "ViewProfile", new { id = Model.UserID }, new { target = "_blank" }) | 
    @Html.ActionLink("Send Private Message", "SendNew", "PrivateMessages", new { id = Model.UserID }) | 
    @Html.ActionLink("Send E-mail", "Send", "Email", new { id = Model.UserID }) 
    @if (!String.IsNullOrWhiteSpace(Model.Web)) { 
    <text>| <a href="@Model.Web" target="_blank">Visit user Web site: @Model.Web</a></text> 
    } 
</div> 

Lorsque vous avez une déclaration @if, quoi que ce soit après les Curlys est toujours considéré comme « code » de sorte que vous devez sortir de celui-ci soit en utilisant une balise <text> ou la syntaxe @:.

La raison de ce comportement est que souvent vous avez une sorte de balises imbriquées dans la condition de toute façon, dans lequel cas les choses fonctionnent:

@if(condition) { 
    <div>Some content</div> 
} 

La balise <text> est là pour les cas où vous don ne veulent pas que le contenu du conditionnel soit enveloppé dans des balises.

+0

Parfait ... c'est l'explication que je cherchais. Je suppose que ce n'était pas clair pour moi que le code a besoin d'un "signal de fin" et qu'une nouvelle ligne ne le fasse pas. En passant, nous sommes très excités par le RC ici à STO. :) –

+0

ScottGu vient de publier une explication assez complète de tout ce concept sur http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt -text-gt-syntax.aspx – bdukes

2

Vous ne pouvez pas avoir du contenu en texte brut à l'intérieur d'un bloc de code, le moteur Razor ne peut pas savoir s'il s'agit d'un code ou d'un balisage. C'est ce que les étiquettes <text> sont là, pour lever l'ambiguïté. Êtes-vous en train de dire que les balises <text> le font fonctionner (c'est la réponse, il n'y a plus rien à faire), ou qu'il ne fonctionne toujours pas avec les balises <text> (essayez d'enrouler le bloc if dans la balise <text>)?