Что делает блок кода @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 и когда я когда-либо его использую?
Ответы
Ответ 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), если вы не напишете этот код в представлении.
Я не уверен, что стоит переключиться с темы на модуль только для получения размера столбца.