Nano Hash - криптовалюты, майнинг, программирование

Как создать функцию в шаблоне cshtml?

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



Ответы:


1

Вы можете использовать директиву @helper Razor:

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

Затем вы вызываете его так:

@WelcomeMessage("John Smith")
30.06.2011
  • Вы не можете помещать теги в методы @functions, поэтому мне нравится этот ответ. 23.10.2013
  • Да, это намного лучше, чем объявление функции. Гораздо проще. 05.06.2015
  • Но вы не можете возвращать переменные (отсюда и слово функция) 16.06.2016
  • @ Пол, я не понимаю, что ты имеешь в виду. 21.06.2016
  • Я просто комментировал, что не думаю, что @helper может вернуть переменную. Он просто отображает разметку / бритву. Когда я прочитал сообщение OP, я подумал, что ему нужно вернуть переменную, но, возможно, нет. 21.06.2016
  • Понятно. Вы имеете в виду, что @helper не может возвращать значения, отличные от IHtmlString. Это правильно. @helper похож на специализированную функцию, которая оптимизирована для возврата HTML (т.е. она выполняет кодирование HTML автоматически, тогда как простые функции этого не делают.) 21.06.2016
  • Поддерживает ли ядро ​​asp.net также @helper? 13.08.2018
  • @ MuM6oJuM6o нет, это не так. Вы можете найти альтернативы, перечисленные в этой статье Что помогло в ASP.NET Core? 12.03.2020

  • 2

    почему бы просто не объявить эту функцию внутри файла cshtml?

    @functions{
        public string GetSomeString(){
            return string.Empty;
        }
    }
    
    <h2>index</h2>
    @GetSomeString()
    
    30.06.2011
  • Это должно быть отмечено как ответ, поскольку директива @functions специально соответствует требованиям OP. Функция Helpers предназначена для совместного использования в нескольких файлах шаблонов путем помещения файла с директивой @helper в каталог App_Code. Принимая во внимание, что директива @functions позволяет использовать функцию только в шаблоне, который ее объявляет. 05.07.2011
  • Я не хотел ничего говорить, но OP сказал, но моя функция просто нужна в одном файле cshtml - мой ответ obv делает именно это там, где отмеченный ответ не делает. 05.07.2011
  • @ stimpy77 Можете ли вы предоставить источник для функции Помощники, предназначенной для совместного использования в нескольких файлах шаблонов? См. ASP.NET MVC 3 и вспомогательный синтаксис в Razor в блоге ScottGu. 28.07.2011
  • o.O ваша собственная ссылка довольно ясна. Повторно используя помощников в нескольких представлениях, мы можем определить вспомогательный метод вне нашего шаблона представления и разрешить его повторное использование во всех шаблонах представления в нашем проекте бла-бла-бла 29.07.2011
  • @ stimpy77 Давайте попробуем еще раз: В качестве альтернативы мы можем определить метод Helper вне нашего шаблона представления ... (ScottGu) - Функция Helpers предназначена для совместного использования в множественный шаблон ... (вы) Альтернативная часть (которую вы для удобства исключили из цитаты Скотта) и предполагаемая часть (которую вы без необходимости добавляли к своей) являются ключевыми. Обычно мы используем яйца для приготовления пищи. Тот факт, что мы альтернативно можем использовать их для приготовления яиц, не означает, что они предназначены для этого или что мы не должны использовать яйца для приготовления завтрака. 03.08.2011
  • Дэниел, вы оспариваете семантику альтернативы, но я считаю весьма сомнительным, что ScottGu имеет опыт работы в качестве юриста. Он явно использовал пошаговый учебный подход к обучению лучшим практикам, ведущим к конечной цели. Мне кажется, что все в статье отформатировано так, чтобы можно было предположить, что весь смысл этой функции заключается в возможности ее повторного использования. Более того, семантически, помощник - это фактически служебная функция, которая по определению предназначена для повторного использования, а не функция, которая будет использоваться в изолированном контексте. Я оставляю ваше мнение и прошу, чтобы мы согласились не согласиться. 03.08.2011
  • Я согласен с stimpy77 - я также согласен с тем, что OP попросил способ показать средства для выполнения функции, которая необходима только внутри одного файла cshtml. если у вас есть глобально доступные методы, которые не нужны за рамками разового использования, ваш API станет непригодным для использования. 04.08.2011
  • Также обратите внимание, что помощники, похоже, ориентированы на возвращение строк, как это уже делают другие помощники для бритвы, и, таким образом, решение functions обеспечивает большую гибкость для других типов возвращаемых данных. Оба ответа получили +1 в моей книге, так как они оба являются полезными лакомыми кусочками информации. 25.10.2011
  • @AaronLS Согласен. Использование функций также дает вам возможность сделать функции закрытыми, в отличие от помощников. 17.02.2012
  • @AaronLS Честно говоря, помощники возвращают не строки, а IHtmlString, которые заботятся о кодировке HTML за вас и защищают ваше приложение от XSS-атак. Помощники также обеспечивают удобство синтаксиса Razor в самом помощнике, которое вы теряете с функциями. Другими словами, <p>Welcome, @username.</p> против return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");. 21.02.2012
  • @Daniel +1 Полезно знать. Лучшего точно нет. Каждый из них обеспечивает различный тип гибкости в зависимости от того, чего вы хотите достичь. 21.02.2012
  • Однако использование @helper в одном представлении не делает его доступным для других представлений. Причина, по которой мне больше нравится @helper, заключается в том, что вы можете поместить html между фигурными скобками. @functions (легко) не позволяет вам это делать. 23.10.2013
  • Просто для записи: и @helper, и @functions могут совместно использоваться многими представлениями, и оба могут быть объявлены в одном представлении и использоваться им (и я лично нашел их применение как в общих, так и в одиночных сценариях). ИМХО, единственное практическое различие между ними заключается в том, что помощник представления добавляет синтаксический сахар для возврата отрисованных фрагментов HTML (или, что более уместно, экземпляров HelperResult), в то время как функция представления обычно полезна только для возврата простых ссылочные или значения типа. 24.01.2014
  • как я могу использовать функцию, определенную в другом файле? 02.12.2016
  • @GeorgiKovachev поместил их в каталог App_Code, и они стали доступны по всему миру. 11.12.2016
  • Вот и все .. работает так хорошо 28.06.2021

  • 3

    Если ваш метод не должен возвращать 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)
    
    30.06.2011
  • Это работает, но это далеко не простота. Моя святая книга - простота;). Но спасибо за предоставленные альтернативы. 30.06.2011
  • Однако это полезно, если вам нужно получить доступ к глобальным переменным страницы в вашей функции, есть ли другой способ сделать это? : / 16.02.2019

  • 4

    Взгляните на Declarative Razor Helpers

    30.06.2011

    5

    В ASP.NET Core Razor Pages вы можете комбинировать C # и HTML в функции:

    @model PagerModel
    @{
    }
    
    @functions 
    {
        void PagerNumber(int pageNumber, int currentPage)
        {
            if (pageNumber == currentPage)
            {
                <span class="page-number-current">@pageNumber</span>
            }
            else
            {
                <a class="page-number-other" href="/table/@pageNumber">@pageNumber</a>
            }
        }
    }
    
    <p>@PagerNumber(1,2) @PagerNumber(2,2) @PagerNumber(3,2)</p>
    
    29.07.2020

    6

    Если вы хотите получить доступ к глобальным переменным вашей страницы, вы можете сделать это:

    @{
        ViewData["Title"] = "Home Page";
    
        var LoadingButtons = Model.ToDictionary(person => person, person => false);
    
        string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
    }
    
    16.02.2019
  • Начиная с C # 7.0, это единственный правильный и правильный ответ. GetLoadingState() вот локальная функция. 27.04.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..