Как определить метод в Razor?

213

Как определить метод в Razor?

Rookian
источник
1
Для тех, кто хотел посмотреть, какие есть варианты: Есть два способа сделать это. Один. используя «@function», а другой - «@helper». Разница между ними хорошо объяснена здесь. mikesdotnetting.com/article/173/…
b1k

Ответы:

310

Оставляя в покое любые споры о том, когда (если когда-либо) это должно быть сделано, @functions - это то, как вы это делаете.

@functions {

    // Add code here.

}
Дэвид Руттка
источник
16
+1 спасибо, к вашему сведению это называется практичность. MVC не единственная игра в городе. Некоторым людям нравится простая бритва и URLRewrite, так как MVC очень полезен для ИМО
Джейсон Себринг,
5
@functionsэто хорошее место для организации просмотра конкретного кода генерации.
Показательный
1
Привет, Дэвид, как я могу определить функцию в одном файле и использовать ее в другом файле?
Георгий Ковачев
Георгий, это называется "Razor HTML Helper". По сути, класс, определенный в папке «Код», с набором статических методов, как предлагается здесь: 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, вы приходите, и я узнаю что-то новое :)
Серж Саган
3
Эквивалентом ядра ASP.NET является Tag Helper: 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 sytnax, представленный в виде метода и предназначенный для визуализации HTML в браузере, тогда как функция - это статический служебный метод, который можно вызывать из любого места в приложении веб-страниц. Тип возвращаемого значения для помощника всегда HelperResult, тогда как тип возвращаемого значения для функции - то, что вы хотите, чтобы это было.

gdmanandamohon
источник
2
Вызов функции путем пропуска @Functionsпрефикса, как @OrderedList(...)у меня работает в .netcore.
Muflix
12

Вы также можете сделать это с Func, как это

@{
    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
источник
10

Бритва - это просто шаблонизатор.

Вы должны создать обычный класс.

Если вы хотите создать метод внутри страницы Razor, поместите их в @functionsблок .

SLaks
источник
1

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

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

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>
Sasinosoft
источник
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>
Джоэл Виклунд
источник