#c# #botframework #chatbot
#c# #ботфреймворк #чат-бот
Вопрос:
Я использую ChoicePrompt в WaterfallStep для отображения вариантов. Проблема в том, что если список выбора больше 10, я не получаю кнопки, которые отображаются в виде текста. Пожалуйста, помогите мне, как исправить эту ошибку.
var waterfallSteps = new WaterfallStep[]
{
InitializeStateStepAsync,
PromptShowChoiceStepAsync,
DisplaySuccessStepAsync,
};
AddDialog(new WaterfallDialog("waterfallDialog", waterfallSteps));
AddDialog(new ChoicePrompt("ShowChoicePrompt", ValidateShowChoice));
private async Task<DialogTurnResult> ValidateShowChoice(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
return await stepContext.PromptAsync("ShowChoicePrompt", new PromptOptions
{
Prompt = MessageFactory.Text("Please select from choices"),
RetryPrompt = MessageFactory.Text("Sorry, Please the valid choice"),
Choices = ChoiceFactory.ToChoices(choicesList),
}, cancellationToken);
}
}
Если количество choicesList больше 10, я получаю кнопки, подобные этой. Что не является проблемой в Bot Framework V3.
Please select from choices
1. Choice-1
2. Choice-2
3. Choice-3
4. Choice-4
5. Choice-5
6. Choice-6
7. Choice-7
8. Choice-8
9. Choice-9
10. Choice-10
11. Choice-11
12. Choice-12
13. Choice-13
Пожалуйста, помогите мне, как устранить эту ошибку.
Комментарии:
1. Какой канал вы используете?
2. Facebook и skype.
3. Вы уверены, что сможете отобразить более 11 быстрых ответов Facebook с помощью Bot Builder v3? Похоже, это ограничение канала
4. В Bot Builder V3 приглашение выбора отображается в виде кнопок, поэтому здесь нет проблем. Теперь в версии 4 запрос на выбор отображается в виде быстрых ответов.
5. Да, @KyleDelaney!! Это приемлемый ответ. Спасибо!!
Ответ №1:
Подсказки выбора в версии v3 по умолчанию использовали карты героев. Вы можете заставить свои подсказки использовать карты героев с помощью новой HeroCard
опции в ListStyle
перечислении. Стиль списка может быть применен непосредственно к приглашению, когда вы добавляете его в свой набор диалоговых окон:
AddDialog(new ChoicePrompt("ShowChoicePrompt", ValidateShowChoice) { Style = ListStyle.HeroCard });
У вас также теперь есть возможность указать стиль списка в параметрах приглашения:
return await stepContext.PromptAsync("ShowChoicePrompt", new PromptOptions
{
Prompt = MessageFactory.Text("Please select from choices"),
RetryPrompt = MessageFactory.Text("Sorry, Please the valid choice"),
Choices = ChoiceFactory.ToChoices(choicesList),
Style = ListStyle.HeroCard,
}, cancellationToken);
Хотя это правда, что включать слишком много кнопок в сообщение — плохая практика, и большинство каналов применяют это соглашение, не разрешая использовать много кнопок на карте, соединители Facebook и Skype автоматически сгенерируют несколько карт, если вы попытаетесь разместить слишком много кнопок на одной карте.
В Facebook Messenger это будет выглядеть так:
В Skype это будет выглядеть так:
Ответ №2:
Эти варианты отображения сделаны из-за ограничений / рекомендаций по используемым каналам.
Если вы посмотрите страницу Facebook Messenger разработчика о Quick replies
здесь, там говорится:
Быстрые ответы предоставляют способ представить набор из до 11 кнопок в диалоге, которые содержат заголовок и необязательное изображение и отображаются на видном месте над композитором. Вы также можете использовать быстрые ответы для запроса местоположения пользователя, адреса электронной почты и номера телефона.
Как следствие, в коде BotBuilder, доступном на Github, у вас будет способ Determine if a number of Suggested Actions are supported by a Channel
здесь:
/// <summary>
/// Determine if a number of Suggested Actions are supported by a Channel.
/// </summary>
/// <param name="channelId">The Channel to check the if Suggested Actions are supported in.</param>
/// <param name="buttonCnt">(Optional) The number of Suggested Actions to check for the Channel.</param>
/// <returns>True if the Channel supports the buttonCnt total Suggested Actions, False if the Channel does not support that number of Suggested Actions.</returns>
public static bool SupportsSuggestedActions(string channelId, int buttonCnt = 100)
{
switch (channelId)
{
// https://developers.facebook.com/docs/messenger-platform/send-messages/quick-replies
case Connector.Channels.Facebook:
case Connector.Channels.Skype:
return buttonCnt <= 10;
// ...
}
}
Затем в ChoiceFactory
том, который вы использовали, выбирается отображение (смотрите код здесь):
public static IMessageActivity ForChannel(string channelId, IList<Choice> list, string text = null, string speak = null, ChoiceFactoryOptions options = null)
{
channelId = channelId ?? string.Empty;
list = list ?? new List<Choice>();
// Find maximum title length
var maxTitleLength = 0;
foreach (var choice in list)
{
var l = choice.Action != null amp;amp; !string.IsNullOrEmpty(choice.Action.Title) ? choice.Action.Title.Length : choice.Value.Length;
if (l > maxTitleLength)
{
maxTitleLength = l;
}
}
// Determine list style
var supportsSuggestedActions = Channel.SupportsSuggestedActions(channelId, list.Count);
var supportsCardActions = Channel.SupportsCardActions(channelId, list.Count);
var maxActionTitleLength = Channel.MaxActionTitleLength(channelId);
var hasMessageFeed = Channel.HasMessageFeed(channelId);
var longTitles = maxTitleLength > maxActionTitleLength;
if (!longTitles amp;amp; !supportsSuggestedActions amp;amp; supportsCardActions)
{
// SuggestedActions is the preferred approach, but for channels that don't
// support them (e.g. Teams, Cortana) we should use a HeroCard with CardActions
return HeroCard(list, text, speak);
}
else if (!longTitles amp;amp; supportsSuggestedActions)
{
// We always prefer showing choices using suggested actions. If the titles are too long, however,
// we'll have to show them as a text list.
return SuggestedAction(list, text, speak);
}
else if (!longTitles amp;amp; list.Count <= 3)
{
// If the titles are short and there are 3 or less choices we'll use an inline list.
return Inline(list, text, speak, options);
}
else
{
// Show a numbered list.
return List(list, text, speak, options);
}
}
Вот почему вы получаете список, если вы предоставляете более 10 элементов.
Как правило, рекомендуется ограничить количество кнопок, более 10 — это огромный. Вы можете адаптировать свое поведение (группирование элементов / добавление дополнительного уровня выбора по группам, например)