Wix: установите точку с запятой в CustomActionData.

У меня проблема с настройкой данных, содержащих точки с запятой, в свойство CustomActionData. По умолчанию класс CustomActionData использует точку с запятой в качестве DataSeparator и разбивает мои данные, если они содержат точки с запятой. Есть ли способ поставить точку с запятой в CustomActionData, кроме замены их ключевым словом come?


person Roman Kuzyk    schedule 07.04.2011    source источник
comment
Вы пробовали помещать данные с точкой с запятой внутри в свойство? В этом случае это будет выглядеть как param1=[value1];param2=[value2] и т. Д.   -  person Yan Sklyarenko    schedule 07.04.2011
comment
да. На самом деле у меня есть точка с запятой внутри одного из моих свойств. В этом случае я разбил данные в CustomAction, потому что CustomActionData разделяет значение моего свойства на две части.   -  person Roman Kuzyk    schedule 07.04.2011
comment
Попробуйте использовать обратную косую черту (\), чтобы избежать точки с запятой   -  person Yan Sklyarenko    schedule 07.04.2011
comment
Заменять ; с участием \;? Я не знаю, когда на самом деле будет точка с запятой, потому что это свойство пароля, заполняемое пользователем. P.S. Да, я знаю, что это небезопасно. :(   -  person Roman Kuzyk    schedule 07.04.2011
comment
С использованием \; у меня не работает.   -  person Roman Kuzyk    schedule 07.04.2011
comment
Хорошо, у меня кончились идеи ... надеюсь, кто-то еще может помочь ...   -  person Yan Sklyarenko    schedule 07.04.2011


Ответы (3)


чтобы передать точку с запятой в CustomActionData, вы должны добавить еще одну точку с запятой.

Пример:

CustomActionData = "key1 = value1; key2 = value2.1 ;; value2.2 ;; value2.3" - это передаст key1 = value1 и key2 = value2.1; value2.2; value2.3.

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

Если есть еще символы, от которых вы не знаете, как убежать, вы легко узнаете, что создаете простое приложение, которое создает экземпляр CustomActionData, добавляет пару ключ-значение и выводит строковое представление CustomActionData с помощью ToString ().

Пример:

CustomActionData data = new CustomActionData();
data.Add("key1", "value1");
data.Add("key2", "value2.1;value2.2;value2.3");

Console.WriteLine(data.ToString());

Надеюсь, информация окажется полезной.

person Petar Raykov    schedule 08.04.2011
comment
Tnx. Я создал дополнительное CustomAction для замены точек с запятой по ключевым словам. - person Roman Kuzyk; 08.04.2011
comment
Вы также можете получить доступ к необработанной строке через session["CustomActionData"], если хотите контролировать ее десериализацию. Это все, что выполняет session.CustomActionData. - person jnm2; 27.10.2017

Еще в 2006 году я написал в блоге статью и образец проекта:

InstallScript, соответствие CustomActionData

В основном я использовал шаблон: / KEY1 = VALUE1 / KEY2 = VALUE2

Библиотека работала, вызывая функцию поиска, передавая ей "/ KEY1 =". Затем он вернул все данные до конца до следующего «/».

Несмотря на это, я больше не использую это, так как я перешел на C # DTF, в котором есть класс CustomActionData, который выполняет дериализацию / десериализацию за меня.

person Christopher Painter    schedule 07.04.2011
comment
Добавлен быстрый ответ с вашим подходом JSON для CustomActionData. - person Stein Åsmul; 25.03.2019

Строки JSON: Крис Пейнтер, который также ответил на этот вопрос более старым подходом, написал в блоге запись, которая революционизирует обработку CustomActionData за счет использования JSON strings. Теперь нет необходимости выполнять синтаксический анализ строк, поскольку вы используете правильную библиотеку JSON. Встроенная сериализация / десериализация: http://blog.iswix.com/2011/10/beam-me-up-using-json-to-serialize.html.

Технически: технические подробности будут различаться в зависимости от языка, но сами строки JSON просты:

Groups=[{"Name":"Rockers","Description":"People who rock!"}]

Вы можете воскресить объект в отложенном режиме! Просто позвонив Serialize и Deserialize.

person Stein Åsmul    schedule 24.03.2019
comment
Это все равно не работает, если модель содержит точку с запятой в одном из значений ... - person ViRuSTriNiTy; 28.05.2021
comment
Я не тестировал его, но вот образец с использованием метода сериализации DTF. Интересную часть см. здесь код настраиваемого действия. Также см. Этот ответ. Вот образец ручного способа выполнения CustomActionData (с использованием собственных действий). - person Stein Åsmul; 28.05.2021