Как добавить условный пакет script?

У меня есть пакет javascript, который я хочу включить только при тестировании, а не при развертывании кода для производства.

Я добавил свойство под названием IsEnabledTestingFeatures. В файле BundleConfig.cs я обращаюсь к нему так:

if(Properties.Settings.Default.IsEnabledTestingFeatures) {
    bundles.Add(new ScriptBundle("~/bundles/testing").Include("~/Scripts/set-date.js"));
}

Это работает правильно.

Теперь я хочу включить пакет на свою страницу, если для этого свойства установлено значение true.

Я пробовал следующее, но компилятор жалуется, что он не может найти пространство имен Default:

@{
    if( [PROJECT NAMESPACE].Properties.Default.IsEnabledTestingFeatures)
    {
        @Scripts.Render("~/bundles/testing")
    }
}

Я попытался найти, как получить доступ к функциям Scripts.Render от самого контроллера, но не увенчался успехом.

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

Ответ 1

До тех пор, пока не будет предложено альтернативное решение [читать: лучше], я реализовал его с помощью ViewBag.

BundleConfig.cs

//if testing features are enabled (eg: "Set Date"), include the necessary scripts
if(Properties.Settings.Default.IsEnabledTestingFeatures)
{
    bundles.Add(new ScriptBundle("~/bundles/testing").Include(
        "~/Scripts/set-date.js"));
}

контроллер

public ActionResult Index()
{
    ViewBag.IsEnabledTestingFeatures = Properties.Settings.Default.IsEnabledTestingFeatures;
    return View();
}

Просмотр

@if (ViewBag.IsEnabledTestingFeatures != null && ViewBag.IsEnabledTestingFeatures)
{
    @Scripts.Render("~/bundles/site")
}

Некоторые примечания:

  • Я не реализовал это через свойство в ViewModel из-за этого свойство/функция не зависит от отображаемых данных. Это казалось неправильным связать это условие с отдельными данными модели, поскольку это общесистемная функция.

  • Я использовал настройки уровня приложения, потому что будет проще настроить это свойство на основе среды для каждого из-за того, что мы используем веб-преобразования. Таким образом, каждая среда может установить это свойство по мере необходимости.

Ответ 2

ViewBag не нужно...

Используя appSettings из web.config, вам не нужно перекомпилировать для тестирования и легко развертывать.

<appSettings>
    <add key="TestingEnabled" value="true" />
</appSettings>

Просмотр или макет

@{
    bool testing = Convert.ToBoolean(
        System.Configuration.ConfigurationManager.AppSettings["TestingEnabled"]);
}

@if (testing) {
    @Scripts.Render("~/bundles/testing")
}

И я бы определил "~/bundles/testing" в BundleConfig независимо от условия тестирования, если вы не хотите связать это с другими скриптами.

Если вы назначили Properties.Default.IsEnabledTestingFeatures из AppSettings, то корень вашей проблемы заключается в том, как вы реализовали свои Свойства.