Como defino um método no Razor?

213

Como defino um método no Razor?

Rookian
fonte
1
Para quem queria ver quais são as opções: existem duas maneiras de fazer isso. 1. usando "@function" e outro usando "@helper". A diferença entre eles é bem explicada aqui. mikesdotnetting.com/article/173/...
B1K

Respostas:

310

Deixando sozinho qualquer debate sobre quando (se alguma vez) deve ser feito, o @functions é como você o faz.

@functions {

    // Add code here.

}
David Ruttka
fonte
16
+1 obrigado, FYI é chamado praticidade. MVC não é o único jogo na cidade. Algumas pessoas como navalha simples e UrlRewrite como MVC é muito para fazer por pouco benefício IMO
Jason Sebring
5
@functionsé um bom lugar para organizar a exibição de código de geração específico . Caso em questão: aqueles feio cliente modelos de-cordas ..
user2864740
1
oi David, como posso definir a função em um arquivo e usá-lo em outro arquivo?
Georgi Kovachev
Georgi, isso é chamado de "Razor HTML Helper". Basicamente, uma classe definida na sua pasta de código, com um conjunto de métodos estáticos, como sugerido aqui: asp.net/mvc/overview/older-versions-1/views/...
jeanie77
Georgi, você já deve ter percebido isso agora ... mas, para reutilizar as opções <code> @functions </code> ou <code> @helper </code> Razor, você pode usar um arquivo como Shared.cshtml em seu App_Code pasta. Lá você pode definir <code> @functions {} </code> ou <code> @helper MyFunction () {} </code> e usá-los em outros modelos de Razor, como <code> @ Shared.MyFunction () < / code> onde o nome do arquivo é como o "namespace" #
Jamie Altizer
194

Você quer dizer auxiliar em linha?

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

@SayHello("John")
Darin Dimitrov
fonte
4
Eu quero definir um método que retorna não um MvcHtmlString, mas um tipo de C #.
Rookian
4
@Rookian, por que você precisaria escrever código C # em uma exibição? Quero dizer, métodos de escrita em uma visão estão errados! Você poderia perfeitamente escrever seu código C # em qualquer lugar que pertencer e, em seguida, invocar o método em uma exibição do Razor, e é exatamente isso que os auxiliares de HTML fazem. E eles não devem retornar sempre um MvcHtmlString.
Darin Dimitrov 01/03
1
@Rookian, talvez você possa explicar o que está tentando fazer em primeiro lugar. Seja o que for que eu tenho certeza que há uma maneira melhor de fazê-lo, em vez de escrever código C # numa vista :-)
Darin Dimitrov
1
Isso é incrível! Obrigado Darin ... apenas quando eu acho que sei tudo sobre MVC, você vem e eu aprendo algo novo :)
Serj Sagan
3
O equivalente ASP.NET Core é o Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/...
beercohol
34

É muito simples definir uma função dentro do barbeador.

@functions {

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

Então você pode chamar uma função em qualquer lugar. Gostar

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

No entanto, esse mesmo trabalho também pode ser feito helper. Como um exemplo

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

Então qual é a diferença?? De acordo com este post anterior, @helpers e @functions compartilham uma coisa em comum - eles tornam a reutilização de código uma possibilidade nas Páginas da Web. Eles também compartilham outra coisa em comum - eles parecem iguais à primeira vista, o que pode causar um pouco de confusão sobre seus papéis. No entanto, eles não são os mesmos. Em essência, um auxiliar é um snippet reutilizável do Razor sytnax exposto como método e destina-se à renderização de HTML para o navegador, enquanto uma função é um método de utilitário estático que pode ser chamado de qualquer lugar no aplicativo Web Pages. O tipo de retorno para um auxiliar é sempre HelperResult, enquanto o tipo de retorno para uma função é o que você deseja que seja.

gdmanandamohon
fonte
2
Chamar a função, omitindo o @Functionsprefixo, como @OrderedList(...)funciona para mim no .netcore.
Muflix
12

Você também pode fazê-lo com um 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
fonte
10

O Razor é apenas um mecanismo de modelagem.

Você deve criar uma classe regular.

Se você deseja criar um método dentro de uma página do Razor, coloque-os em um @functionsbloco .

SLaks
fonte
1

Você pode simplesmente declará-las como funções locais em um bloco de barbear (ou seja @{}).

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

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

Você também pode usar o @{ }bloco para criar funções:

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

Mais tarde, em sua página de barbear:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>
Daniel
fonte
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
fonte