¿Cómo defino un método en Razor?

Respuestas:

310

Dejando en paz cualquier debate sobre cuándo (si alguna vez) debería hacerse, @functions es cómo lo hace.

@functions {

    // Add code here.

}
David Ruttka
fuente
16
+1 gracias, para tu información se llama practicidad. MVC no es el único juego en la ciudad. A algunas personas les gusta la maquinilla de afeitar simple y URLRewrite ya que MVC tiene mucho que hacer por poco beneficio IMO
Jason Sebring
55
@functionses un buen lugar para organizar ver código de generación específico . Caso en cuestión: esas plantillas de cliente feas de cadenas ..
user2864740
1
hola David, ¿cómo puedo definir la función en un archivo y usarla en otro archivo?
Georgi Kovachev
Georgi, esto se llama "Razor HTML Helper". Básicamente, una clase definida en su carpeta de Código, con un conjunto de métodos estáticos como se sugiere aquí: asp.net/mvc/overview/older-versions-1/views/…
jeanie77
Georgi, es posible que ya te hayas encontrado con esto ... pero para reutilizar las opciones de <code> @functions </code> o <code> @helper </code> Razor puedes usar un archivo como Shared.cshtml en tu App_Code carpeta. Allí puede definir <code> @functions {} </code> o <code> @helper MyFunction () {} </code> y usarlos en sus otras plantillas Razor como <code> @ Shared.MyFunction () < / code> donde el nombre del archivo es como el "espacio de nombres"
Jamie Altizer
194

¿Te refieres a ayuda en línea?

@helper SayHello(string name)
{
    <div>Hello @name</div>
}

@SayHello("John")
Darin Dimitrov
fuente
44
Quiero definir un método que devuelva no un MvcHtmlString, sino un tipo C #.
Rookian
44
@Rookian, ¿por qué necesitarías escribir código C # en una vista? ¡Quiero decir que escribir métodos en una vista es simplemente incorrecto! Podrías escribir perfectamente tu código C # donde sea que pertenezca y luego invocar el método en una vista Razor, y eso es exactamente lo que hacen los ayudantes HTML. Y no se supone que devuelvan siempre un MvcHtmlString.
Darin Dimitrov
1
@Rookian, tal vez podrías explicar lo que estás tratando de hacer en primer lugar. Sea lo que sea, estoy seguro de que hay una mejor manera de hacerlo en lugar de escribir el código C # en una vista :-)
Darin Dimitrov
1
¡Esto es asombroso! Gracias Darin ... justo cuando creo que sé todo sobre MVC, vienes y aprendo algo nuevo :)
Serj Sagan
3
El equivalente de ASP.NET Core es Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol el
34

Es muy simple definir una función dentro de la maquinilla de afeitar.

@functions {

    public static HtmlString OrderedList(IEnumerable<string> items)
    { }
}

Entonces puede llamar a la función en cualquier lugar. Me gusta

@Functions.OrderedList(new[] { "Blue", "Red", "Green" })

Sin embargo, este mismo trabajo también se puede hacer helper. Como ejemplo

@helper OrderedList(IEnumerable<string> items){
    <ol>
        @foreach(var item in items){
            <li>@item</li>
        }
    </ol>
}

¿¿Entonces cuál es la diferencia?? Según esta publicación anterior, tanto @helpers como @functions comparten una cosa en común: hacen posible la reutilización de códigos dentro de las páginas web. También comparten otra cosa en común: se ven iguales a primera vista, que es lo que podría causar un poco de confusión sobre sus roles. Sin embargo, no son lo mismo. En esencia, un ayudante es un fragmento reutilizable de la sintaxis Razor expuesta como método, y está destinado a representar HTML en el navegador, mientras que una función es un método de utilidad estático que se puede llamar desde cualquier lugar dentro de la aplicación de páginas web. El tipo de retorno para un ayudante es siempre HelperResult, mientras que el tipo de retorno para una función es lo que usted quiera que sea.

gdmanandamohon
fuente
2
Llamando a la función al omitir el @Functionsprefijo como @OrderedList(...)funciona para mí en .netcore.
Muflix
12

También puedes hacerlo con un Func como este

@{
    var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}

<div style="@getStyle(50, 2)"></div>
Bokoskokos
fuente
10

Razor es solo un motor de plantillas.

Deberías crear una clase regular.

Si desea crear un método dentro de una página Razor, colóquelos en un @functionsbloque .

SLaks
fuente
1

Simplemente puede declararlos como funciones locales en un bloque de afeitar (es decir @{}).

@{
    int Add(int x, int y)
    {
        return x + y;
    }
}

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>
Sasinosoft
fuente
0

También puede usar el @{ }bloque para crear funciones:

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

Luego, más tarde en su página de afeitar:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>
Daniel
fuente
0

MyModelVm.cs

public class MyModelVm
{
    public HttpStatusCode StatusCode { get; set; }
}

Index.cshtml

@model MyNamespace.MyModelVm
@functions
{
    string GetErrorMessage()
    {
        var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
        string errorMessage;
        if (isNotFound)
        {
            errorMessage = Resources.NotFoundMessage;
        }
        else
        {
            errorMessage = Resources.GeneralErrorMessage
        }

        return errorMessage;
    }
}

<div>
    @GetErrorMessage()
</div>
Joel Wiklund
fuente