Як створити функцію в шаблоні cshtml?


219

Мені потрібно створити функцію, необхідну лише в одному файлі cshtml. Ви можете розглядати мою ситуацію як методи сторінки ASP.NET, які є мінімальними веб-сервісами, що реалізуються на сторінці, оскільки вони приведені до однієї сторінки. Я знаю про помічників HTML (методи розширення), але моя функція потрібна лише в одному файлі cshtml. Я не знаю, як створити функцію підпису всередині представлення. Примітка . Я використовую двигун шаблонів Razor.

Відповіді:


279

Ви можете скористатися директивою @helper Razor:

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}

Тоді ви викликаєте це так:

@WelcomeMessage("John Smith")

13
Ви не можете ставити теги всередині @functionsметодів, тому мені подобається ця відповідь.
— jfren484

1
Так, це набагато краще, ніж оголошення функції. Набагато прямо вперед.
— muglio

2
Але ви не можете повернути змінні (звідси функція слова)
— Пол,

@Paul Я не розумію, що ти маєш на увазі під цим.
— Даніель Люцці

2
Чи підтримує ядро ​​asp.net також @helper?
— MuM6oJuM6o

411

чому б просто не оголосити цю функцію у файлі cshtml?

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()

32
Це слід позначити як відповідь, оскільки директива @functions спеціально відповідає вимогам ОП. Функція Helpers призначена для спільного використання в декількох файлах шаблонів, вводячи файл із директивою @helper у каталог App_Code. Тоді як директива @functions дозволяє використовувати функцію лише шаблон, який її оголошує.
— Джон Девіс

7
Також зауважте, що помічники, орієнтовані на повернення рядків, як і інші помічники бритви, і таким чином functionsрішення забезпечує більшу гнучкість для типів повернення. Обидві відповіді отримують +1 у моїй книзі, хоча вони є корисними підказками інформації.
— AaronLS

8
@AaronLS Справедливості, помічники не повертають рядки, а IHtmlString, які дбають про кодування HTML для вас і захищають ваш додаток від XSS-атак. Також помічники надають вам зручність синтаксису Razor у самому хелпері, який ви втрачаєте за допомогою функцій. Іншими словами, <p>Welcome, @username.</p>проти return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");.
— Даніель Люцці

9
використання @helperодного перегляду, однак, не робить його доступним для інших представлень даних. Причиною, що мені подобається @helper, є те, що ви можете розмістити HTML між фігурними дужками. @functionsне дозволяє (легко) це робити.
— jfren484

5
Тільки для запису: і обидва, @helperі @functionsїх можна поділити між багатьма переглядами, і обидва можуть бути оголошені та використані одним переглядом (і я особисто знайшов їх використання в обох спільних / єдиних сценаріях). Єдина практична відмінність IMHO між ними полягає в тому, що помічник перегляду додає синтаксичний цукор для повернення виведених фрагментів HTML (або, що більш доцільно, HelperResultекземплярів), тоді як функція перегляду зазвичай корисна лише для повернення простих типів посилань або значень.
— rsenna

25

Якщо вашому методу не потрібно повертати html і потрібно робити щось інше, тоді ви можете використовувати лямбда замість хелперного методу в Razor

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

3
Це працює, але це далеко не простота. Моя свята книга - простота;). Але дякую за надання альтернативи.
— Саїд Неаматі

Це корисно, хоча якщо вам потрібно отримати доступ до глобальних змінних сторінок у вашій функції, чи є інший спосіб це зробити? : /
— Олександр Daubricourt


1

Якщо ви хочете отримати доступ до глобальних змінних вашої сторінки, ви можете зробити це:

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

Оскільки C # 7.0 - це єдина правильна і правильна відповідь. GetLoadingState()тут локальна функція.
— Wolfrevo Cats
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.