Как изменить значение атрибута в разделе appSettings с преобразованием Web.config

260

Можно ли преобразовать следующий файл app.ettings Web.config:

<appSettings>
    <add key="developmentModeUserId" value="00297022" />
    <add key="developmentMode" value="true" />
    /* other settings here that should stay */
</appSettings>

во что-то вроде этого:

<appSettings>
    <add key="developmentMode" value="false" />
    /* other settings here that should stay */
</appSettings>

Итак, мне нужно удалить ключ developmentModeUserId , и мне нужно заменить значение для ключа developmentMode .

стрекоза
источник

Ответы:

453

Вы хотите что-то вроде:

<appSettings>
  <add key="developmentModeUserId" xdt:Transform="Remove" xdt:Locator="Match(key)"/>
  <add key="developmentMode" value="false" xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"/>
</appSettings>

См. Также: Синтаксис преобразования Web.config для развертывания проекта веб-приложения.

Джо
источник
24
Обратите внимание, что ключи чувствительны к регистру!
Космин
2
Отличный ответ. Я пробовал сторонние варианты, такие как Slow Cheetah, и ничего не добился - это было просто и идеально.
Стив
2
@stevens: вам понадобится Slow Cheetah, если вы хотите преобразовать, скажем, файлы app.config для собственных приложений. Синтаксис, однако, должен быть идентичным, если я вспоминаю (это было давно, так как я должен был использовать Медленный Гепард).
Эллеседил
альтернатива медленному читеру - создать myotherconfig.staging.config и в преобразовании web.Staging.config преобразовать ссылку на myotherconfig.config в web.config
nologo
3
Небольшое уточнение, которое может помочь некоторым людям: эту xdt:Transform="SetAttributes" xdt:Locator="Match(key)"часть следует использовать в файле Web.Whwhat.config, а не в файле Web.config.
user3533716
11

Замена всех AppSettings

Это тот случай, когда вы просто хотите заменить целый раздел web.config. В этом случае я заменю все AppSettings в web.config на новые настройки в web.release.config. Это мой базовый web.config appSettings:

<appSettings>
  <add key="KeyA" value="ValA"/>
  <add key="KeyB" value="ValB"/>
</appSettings>

Теперь в моем файле web.release.config я собираюсь создать раздел appSettings, за исключением того, что я включу атрибут xdt: Transform = ”Replace”, поскольку я хочу просто заменить весь элемент. Мне не пришлось использовать xdt: Locator, потому что там нечего искать - я просто хочу вытереть планшет и заменить все.

<appSettings xdt:Transform="Replace">
  <add key="ProdKeyA" value="ProdValA"/>
  <add key="ProdKeyB" value="ProdValB"/>
  <add key="ProdKeyC" value="ProdValC"/>
</appSettings>

Обратите внимание, что в файле web.release.config мой раздел appSettings содержит три ключа вместо двух, и ключи даже не совпадают. Теперь давайте посмотрим на сгенерированный файл web.config, что происходит, когда мы публикуем:

<appSettings>
   <add key="ProdKeyA" value="ProdValA"/>
   <add key="ProdKeyB" value="ProdValB"/>
   <add key="ProdKeyC" value="ProdValC"/>
 </appSettings>

Как мы и ожидали, набор настроек web.config был полностью заменен значениями в конфигурации web.release. Это было легко!

Джо
источник
9

Если вы хотите преобразовать настройки приложения из файла веб-конфигурации в файл web.Release.config, вам необходимо выполнить следующие шаги. Пусть ваш файл настроек приложения web.config это

<appSettings>
     <add key ="K1" value="Debendra Dash"/>
  </appSettings>

Теперь вот web.Release.config для преобразования.

<appSettings>
    <add key="K1" value="value dynamicly from Realease"
       xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"   
         />
  </appSettings>

Это преобразует значение K1 в новое значение в режиме возврата.

Дебендра Дэш
источник
1

Я не люблю трансформации, чтобы иметь больше информации, чем нужно. Поэтому вместо того, чтобы перезагружать ключи, я просто формулирую состояние и намерение . Намного легче увидеть намерение, когда это сделано, по крайней мере, ИМО. Кроме того, я стараюсь поставить все xdtатрибуты первыми, чтобы указать читателю, что это преобразования, а не определение новых вещей.

<appSettings>
  <add xdt:Locator="Condition(@key='developmentModeUserId')" xdt:Transform="Remove" />
  <add xdt:Locator="Condition(@key='developmentMode')" xdt:Transform="SetAttributes"
       value="false"/>
</appSettings>

В вышесказанном гораздо легче увидеть, что первый удаляет элемент. Второе - это установка атрибутов. Он установит / заменит любые атрибуты, которые вы здесь определите. В этом случае он будет просто установлен valueна false.

CodingYoshi
источник