SASS с пользовательским значением переменной в ASP.NET MVC

В ответе на эту тему показано, как передать переменную в файл LESS с помощью BundleTransformer для LESS и LessTranslator. К сожалению, в SASS вид BundleTransformer отсутствует свойство GlobalVariables. Можно ли скомпилировать файл SASS с пользовательской переменной (значение цвета) зависит от имени пользователя логина?

2 ответа

Решение аналогичной проблемы (только для LESS) описано в обсуждении "Перечисление переменных BundleTransformer.Less в зависимости от контекста / запроса". Т.е. вам также нужно написать собственную реализацию системы кеширования и использовать InjectContentItemTransform класс (для объявления переменных необходимо использовать Sass-синтаксис). Но в отличие от LESS, у вас нет возможности изменять переменные (доступна только возможность объявления переменных).

Я не использовал расширение SASS, поэтому не могу сказать наверняка, но вы всегда можете создать собственное преобразование пакета, чтобы заменить то, что по сути является файлом шаблона.

Таким образом, вы можете получить файл SASS с переменными, объявленными так

$variable: {{variable-placeholder}};

Затем используйте нечто похожее на следующее, чтобы заменить значения.

public class ReplacePlaceholdersBundleTransform : IBundleTransform
{
    private readonly IDictionary<string, string> _replacements;

    public ReplacePlaceholdersBundleTransform()
    {
        _replacements = new Dictionary<string, string>();
    }

    public ReplacePlaceholdersBundleTransform(IDictionary<string,string> replacements)
    {
        _replacements = replacements ?? new Dictionary<string,string>();
    }

    public void Process(BundleContext context, BundleResponse response)
    {
        if (_replacements.IsNullOrEmpty())
            return;

        foreach (var replacement in _replacements)
        {
            response.Content = response.Content.Replace(replacement.Key, replacement.Value);
        }
    }
}

Чтобы использовать его, добавьте преобразование в пакет.

yourBundle.Transforms.Add(
            new ReplacePlaceholdersBundleTransform(new Dictionary<string, Func<BundleContext, string>>
            {
                {"{{variable-placeholder}}", "red"},
            }));

Мы использовали нечто подобное для преобразования сценариев, чтобы внедрить URL-адреса пакетов в файлы сценариев во время выполнения, чтобы получить полный URL-адрес, созданный платформой оптимизации. По общему признанию это может не сработать, если преобразования выполняются после трансляции SASS, но у меня не было времени развернуть проект SASS, чтобы проверить это.

Надеюсь, это поможет.

Другие вопросы по тегам