sintaxis net mvc component asp asp.net-mvc lambda razor

asp.net-mvc - net - razor mvc



¿Las expresiones lambda son compatibles con Razor? (3)

¿Se admiten las expresiones lambda / métodos anónimos en el motor de visualización de Razor?

Estoy teniendo dificultades para expresar lo siguiente en Razor:

@Model.ToList().ForEach(i => { if (i.DealerName != null) { <text> @i.DealerName </text> } }

Nota: Sé que puede resolver esto con @foreach pero necesito una solución similar para un control de MVC de terceros. Se utiliza este mecanismo para configurar el contenido del control. Funciona bien para las vistas MVC .ASPX pero no puede hacer que funcione con Razor.


Equivalente de MVC .ASPX (el código que me gustaría convertir a la sintaxis de Razor):

<% Model.ToList().ForEach(i => { if (i.DealerName != null) { %> <%=i.DealerName%> <% }; }); %>

Esto es para el motor Razor que se incluye con ASP.NET MVC3.


Alternativamente, puedes crear una función lambda, y llamar a eso para cada elemento en el cuerpo de tu código de Razor (la idea vino de Andy en esta publicación ):

@model IEnumerable<Dealer> @{ Func<Dealer, object> sayHi = @<text> <b>Hello Dealer named: @(item.DealerName)</b> Multiline support is <em>Beautiful!</em> </text>; } <div> @foreach(var dealer in Model.ToList()) { sayHi(dealer); } </div>


En lugar de su bloque <text>@i.DealerName</text> , puede usar un Response.Write(i.DealerName);

El resultado es el mismo, ya que si lo colocas en una página de Razor, se ejecutará mientras se procesa la página. Y, francamente, estoy bastante seguro de que esto es en lo que se compilará.

Además, dado que ForEach() devuelve un valor nulo, deberías soltarlo en la página como un bloque de código. Entonces tu código se vería como esto:

@{ Model.ToList().ForEach(i => { if (i.DealerName != null) { Response.Write(i.DealerName); } }); }

UPD: Si tiene un formato más serio, puede recurrir a este pequeño truco:
(desafortunadamente, la coloración del código aquí no le dará ningún crédito a este fragmento, pero definitivamente verás lo que quiero decir si eliminas esto en el estudio visual. Nota: esto solo funcionará en páginas de Razor, no en archivos de código :))

@{ Model.ToList().ForEach(i => { if (i.DealerName != null) { Response.Write(((Func<dynamic, object>)( @<text> <b>Hello Dealer named: @item.DealerName Multiline support is <em>Beautiful!</em> </text>)).Invoke(i)); } }); }

Espero que tenga sentido :)


Sí, son compatibles. PERO, Razor tiene algunas reglas de escape extrañas y las llaves adicionales causarán que se ahogue a veces, incluso en expresiones lambda extendidas.

Puede simplificar un poco la respuesta de @Artioms para eliminar esas llaves adicionales con un lugar y, opcionalmente, una cláusula de selección.

@{ Model.ToList().ForEach(i => { if (i.DealerName != null) { Response.Write(i.DealerName); } }); }

se convierte en

@{ Model.Where(i=>i.DealerName != null).ToList().ForEach(i => { Response.Write(i.DealerName); }); }

También podría convertirse

@{Model.Where(i=>i.DealerName != null).Select(i=>i.DealerName) .ToList().ForEach(Response.Write);}

¡Yay estilos funcionales!