Як створити функцію в шаблоні 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.