This article is currently in the process of being translated into Spanish (~99% done).
Local Functions
En un artículo anterior, hablamos sobre como Razor nos permite definir un bloque de código dentro de las Vistas, como sigue:
@{
// C# code goes here...
// As many lines as you want!
}
Puedes usar estos bloques de código para casi cualquier cosa que C# pueda hacer- puedes incluso definir funciones locales!. Esto es excelente, porque una función local Razor te permite incluir marcadores, que hace posible que creemos pequeñas funciones plantilla. Esto es útil en varias situaciones, por ejemplo y como podemos ver en el próximo ejemplo, donde necesitamos generar el mismo bloque de marcados muchas veces. Definir una función local es tal y como definir un método en una clase, salvo que una función local no tiene un modificador de acceso (public, private, etc.). He aquí como se vería:
@{
void RenderUserInfo(HelloMVCWorld.Models.WebUser user)
{
<div class="user-info">
@user.LastName, @user.FirstName [@user.Birthday.ToShortDateString()]
</div>
}
}
Fíjate como Razor te permite, elegantemente, mezclar código C# y HTML. Este ejemplo es muy simple, marcado inteligentemente, a propósito, pero puede ser tan complicado como necesites que sea!
Aquí hay un ejemplo completo de como puedes definir y usar estas funciones locales:
@model List<HelloMVCWorld.Models.WebUser>
@{
ViewData["Title"] = "Functions";
}
<h1>Functions</h1>
@{
void RenderUserInfo(HelloMVCWorld.Models.WebUser user)
{
<div class="user-info">
@user.LastName, @user.FirstName [@user.Birthday.ToShortDateString()]
</div>
}
<h2>Users [sorted by first name]</h2>
foreach(var user in Model.OrderBy(x => x.FirstName))
{
RenderUserInfo(user);
}
<h2>Users [sorted by last name]</h2>
foreach(var user in Model.OrderBy(x => x.LastName))
{
RenderUserInfo(user);
}
}
Gracias a la función local (RenderUserInfo), podemos ahora generar la misma lista dos veces, con diferentes ordenamientos y sin tener que escribir el mismo marcado nuevamente!
Funciones locales con un valor de retorno
Te darás cuenta que la función RenderUserInfo() no devuelve nada (está declarada con el valor de retorno void), pero no tiene que ser de esa forma. Tu función local Razor puede fácilmente devolver un valor, tal y como una función/método regular de C#. Esto puede ser útil en algunas situaciones, p.ej. Cuando quieres hacer cálculos complicados para multiples lugares en tu código. Aquí un ejemplo:
@{
int GetTheAnswerToLifeTheUniverseEverything(int x, int y)
{
return x * y;
}
}
<div>
The answer to life, the universe and everything: @GetTheAnswerToLifeTheUniverseEverything(7, 6)
</div>
Obviamente este es un ejemplo absurdo, normalmente la función hará algo más interesante y complicado que una simple multiplicación, pero debería demostrar lo fácil que es definir y usar funciones locales con un valor de retorno. La salida lucirá como sigue:
<div>
The answer to life, the universe and everything: 42
</div>
Sumario
Las funciones locales Razor permiten definir fácilmente funciones que serán usadas en la Vista actual, p.ej. para ejecutar una misma acción muchas veces o para ser usadas como plantillas.