В таких каналах, как Команды, где есть определенный c imBack
тип действия, отличный от postBack
и messageBack
, обычно нет способа отличить guish входящее imBack
действие из напечатанного сообщения.
Чтобы получить желаемое поведение, вы должны использовать postBack
или messageBack
. Они работают так же, как друг с другом в командах, но messageBack
будет лучше сообщать о ваших намерениях. Идея состоит в том, что вы будете отправлять видимый текст вместе с невидимыми метаданными в том же сообщении от пользователя боту.
foreach (var prompt in result.Context.Prompts) {
buttonList.Add(
new CardAction()
{
Type = ActionTypes.MessageBack,
Value = new { source = "button" },
Title = prompt.DisplayText,
Text = prompt.DisplayText,
DisplayText = prompt.DisplayText,
});
}
Почему мы используем prompt.DisplayText
три раза здесь? Заголовок отображается в виде метки на кнопке, текст заполняет свойство Text
действия, а отображаемый текст - это то, что отображается в диалоге.
В командах свойство Value
postBack
или messageBack
должен быть объектом, а не строкой. если бы вы попытались сказать Value = "button"
, вы бы получили пустой объект во входящей деятельности. Так как свойство Value
действия заполняет свойство Value
действия, вы можете определить, является ли входящее действие от кнопки, подобной этой:
if (turnContext.Activity.Value != null
&& JToken.FromObject(turnContext.Activity.Value) is JObject value
&& value["source"] == "button")
Поскольку мои тесты до сих пор указывали, что набранные сообщения никогда не заполняют свойство Value
, вы можете упростить эту проверку до следующего:
if (turnContext.Activity.Value != null)
Обратите внимание, что этот ответ относится только к командам. Существуют разные правила определения того, поступило ли действие с кнопки на разных каналах, и эти правила в настоящее время нигде не документированы. Если вам интересно, Я написал метод для своей библиотеки карт, который выполняет задачу определения того, пришло ли действие от кнопки на каком-либо канале . После освобождения библиотеки вы можете вызвать этот метод и посмотреть, вернет ли он значение null.