Як визначити метод у Razor?


213

Як визначити метод у Razor?


1
Для тих, хто хотів побачити, що є варіанти: Є два способи зробити це. Один. за допомогою "@function" та іншого за допомогою "@helper". Тут різко пояснюється різниця між ними. mikesdotnetting.com/article/173/…
b1k

Відповіді:


310

Залишаючи в спокої будь-які дебати, коли (якщо і колись) це слід робити, @functions - це, як ви це робите.

@functions {

    // Add code here.

}

16
+1 спасибі, FYI це називає практичністю. MVC - не єдина гра в місті. Деяким людям подобається проста бритва та URLRewrite, як MVC - це дуже багато для користі IMO
Jason Sebring

5
@functionsє гарним місцем для організації перегляду конкретного коду генерації. Справа в
суті

1
привіт, Давиде, як я можу визначити функцію в одному файлі та використовувати її в іншому файлі?
Георгій Ковачев

Георгій, це називається "Помощник HTML з Razor". В основному, клас, визначений у вашій папці Code, із набором статичних методів, запропонованих тут: asp.net/mvc/overview/older-versions-1/views/…
jeanie77

Георгі, ти, можливо, вже зараз натрапив на це ... але для повторного використання параметрів <code> @functions </code> або <code> @helper </code> Razor можна використовувати файл, наприклад Shared.cshtml, у своєму App_Code папку. Там ви можете визначити <code> @functions {} </code> або <code> @helper MyFunction () {} </code> та використовувати їх у інших шаблонах Razor, як <code> @ Shared.MyFunction () < / code> де ім'я файлу схоже на "простір імен"
Jamie Altizer

194

Ви маєте на увазі вбудованого помічника?

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

@SayHello("John")

4
Я хочу визначити метод, який повертає не MvcHtmlString, а тип C #.
Rookian

4
@Rookian, навіщо вам коли-небудь потрібно писати код C # на вид? Я маю на увазі методи письма в погляді просто неправильно! Ви можете прекрасно написати свій C # код, де належить, а потім викликати метод у поданні Razor, і саме це і роблять помічники HTML. І вони не повинні повертати завжди MvcHtmlString.
Дарин Димитров

1
@Rookian, можливо, ви могли б пояснити, що ви намагаєтесь зробити в першу чергу. Що б там не було, я впевнений, що є кращий спосіб зробити це, а не писати код C # на виду :-)
Дарин Димитров

1
Це круто! Дякую Дарин ... просто коли я думаю, що я знаю все про MVC, ти заходиш і я дізнаюся щось нове :)
Serj Sagan

3
Основним еквівалентом ASP.NET є помічник тегів: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol

34

Дуже просто визначити функцію всередині бритви.

@functions {

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

Таким чином, ви можете викликати функцію в будь-якому місці. Подібно до

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

Однак цю ж роботу можна зробити і через helper. Як приклад

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

То в чому різниця ?? Згідно з цим попереднього повідомленням обидва @helpers і @Functions ділимося одне спільне - вони роблять код повторного використання можливості в веб - сторінки. Вони також поділяють ще одне спільне - на перший погляд вони виглядають однаково, саме це може викликати трохи плутанини щодо їх ролей. Однак вони не однакові. По суті, помічник - фрагмент багаторазового використання синтаксису Razor, що піддається впливу, і призначений для надання HTML-браузеру, тоді як функцією є метод статичної утиліти, який можна викликати з будь-якого місця вашої програми веб-сторінок. Тип повернення для помічника - це завжди HelperResult, тоді як тип повернення для функції - це все, що ви хочете.


2
Функція виклику, опускаючи @Functionsпрефікс, як @OrderedList(...)працює для мене в .netcore.
Муфлікс

12

Ви також можете зробити це з таким функцією

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

10

Бритви - це лише шаблони.

Вам слід створити звичайний клас.

Якщо ви хочете зробити метод всередині сторінки Razor, покладіть їх у @functionsблок .


1

Ви можете просто оголосити їх як локальні функції в блоці бритви (тобто @{}).

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

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

0

Ви також можете просто використовувати @{ }блок для створення функцій:

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

Потім пізніше на своїй сторінці з бритвою:

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

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.