Подтвердить что ты не робот

Что делает блок кода @functions в файле бритвы, и когда (если когда-либо) я должен его использовать?

Во время просмотра темы, загруженной из галереи Orchard CMS, я заметил, что в файле Layout.cshtml этот блок кода находится в верхней части файла:

@functions {
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following.
string CalcuClassify(string[] zoneNames, string classNamePrefix)
{
    var zoneCounter = 0;
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray());
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : "";
}
}

Я знаю, что делает заявленная функция (вычисляет, какие зоны заполняются для того, чтобы вернуть ширину каждого столбца), мой вопрос: каково правильное использование блока @function и когда я когда-либо его использую?

4b9b3361

Ответ 1

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

  • Функциональность тесно связана с представлением и обычно не используется в другом месте (например, "Как широко я делаю мои столбцы" ).
  • Функциональность - это больше, чем простой оператор if и/или используется в нескольких местах в вашем представлении.
  • Все, что функция должна определить логику, уже существует в Model для представления.

Если вы не используете первый, добавьте его как помощник @Html.

Если вы выйдете из второго, просто вставьте его.

Если вы отказались от третьего, вы должны сделать расчет в своем контроллере и передать результат как часть модели.

Ответ 2

Другие объяснили, что @functions делает это, я не буду перефразировать это. Но я хотел бы добавить это:

Если ваше представление напечатано в режиме просмотра, я думаю, что жизнеспособным вариантом было бы переместить эту логику в режим просмотра, чтобы избежать загромождения вашей разметки слишком большим количеством кода. В противном случае ваши взгляды начинают выглядеть все более похожими на классический ASP, и я не думаю, что кто-то этого хочет.

Я не думаю, что что-то не так с использованием @functions или @helper в вашем представлении, но как только вы выйдете за рамки нескольких методов на ваш взгляд, или даже если функция несколько сложная, это может стоить рефакторинг в viewmodel, если это вообще возможно. Если это код, который может быть повторно использован, может быть хорошей идеей вывести его в вспомогательный класс или расширение класса HtmlHelper. Одна вещь, которая является обломком, заключается в том, что вы просто переписали фрагмент кода, который уже существует, потому что вы не знали, что он скрыт в произвольном виде.

Ответ 3

Из msdn blogs, блок @functions позволяет вам обматывать повторно используемый код, например методы и свойства

Ответ 4

В этом конкретном случае люди, которые создали тему, которую вы используете, вероятно, пытались сохранить ее как простую тему (только виды, css и изображения).

Если вам нужно написать код для темы для Orchard, вам нужно обратиться к модулю (как указано здесь: http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme), если вы не напишете этот код в представлении.

Я не уверен, что стоит переключиться с темы на модуль только для получения размера столбца.