2010-11-10 12 views
5

Me gustaría pensar que esto es obvio, pero antes de enviar un informe de error, quiero saber que no lo estoy haciendo mal. Tengo esta vista usando ASP.NET MVC3 RC, con la maquinilla de afeitar:MVC Razor 3 sintaxis RC: error o error del usuario?

<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> 

Se ahoga en el "Lugar" y en la tubería en el último condicional. Si inserto algunos <texto> etiquetas, funciona así:

<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> 

A pesar de algunos ensayos y errores, no puedo imaginar lo que estoy haciendo esto es malo. Sugerencias?

Respuesta

7

su margen de beneficio debe ser el siguiente

<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> 

Cuando usted tiene una declaración @if, nada después de las curlys todavía se considera ser 'código' lo que necesita para salir de ella, ya sea usando una etiqueta <text> o la sintaxis @:.

La razón de este comportamiento es que con frecuencia tendrá algún tipo de etiqueta anidada dentro de la condicional de todos modos, en cuyo caso las cosas funcionan:

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

La etiqueta <text> está ahí para aquellos casos cuando Don No quiero que los contenidos del condicional estén envueltos en ninguna etiqueta.

+0

Perfecto ... esa es la explicación que estaba buscando. Supongo que no estaba claro para mí que el código necesita una "señal final" y que una nueva línea no lo hace. Por cierto, estamos muy entusiasmados con el RC aquí en STO. :) –

+0

ScottGu acaba de publicar una explicación bastante completa de este concepto en http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt -text-gt-syntax.aspx – bdukes

2

No puede tener solo contenido de texto sin formato dentro de un bloque de código, el motor Razor no puede determinar si se trata de código o marca. Eso es lo que están las etiquetas <text>, para eliminar la ambigüedad. ¿Está diciendo que las etiquetas <text> lo hacen funcionar (esa es la respuesta, no hay nada más por hacer), o que todavía no funciona con las etiquetas <text> (intente envolver todo el bloque if en la etiqueta <text>)?

Cuestiones relacionadas