Как прервать поток формы в каждый момент, когда я печатаю выход или отмену? - PullRequest
0 голосов
/ 03 октября 2018

Я создаю чат-бота в .Net C #, используя BotFramework.В одном из моих диалогов, когда я начинаю заполнять поток формы, я не могу выйти из формы потока, пока в тот момент я не заполню весь поток.Есть ли возможность выйти и покинуть форму?

Это мой код:

LuisDialog.cs:

      [LuisIntent("balance")]
      public async Task balance(IDialogContext context, LuisResult result)
     {

        var balanca = new FormDialog<BalanceForm>(
                    new BalanceForm(),
                    BalanceForm.BuildForm,
                    FormOptions.PromptInStart,
                    result.Entities);
        context.Call<BalanceForm>(balanca, BalanceCompleted);

BalanceForm.cs

namespace BasicMultiDialog
{

[Serializable]
public class BalanceForm
{

    [Prompt("What is your contract number?")]
    public string contract;

    public static IForm<BalanceForm> BuildForm()
    {
        OnCompletionAsyncDelegate<BalanceForm> wrapUpRequest = async 
    (context, state) =>
        {




                        string wrapUpMessage = "Dear " + house.Firstname + "," + "your  balance is " + house.Balance;
                        await context.PostAsync(wrapUpMessage);


            }
        };
        return new FormBuilder<BalanceForm>().Message
        ("We have to ask you some information")


            .Field(nameof(contract), validate: async (state, response) =>
            {

                var result = new ValidateResult();


                    return result;

                }
            })

            .OnCompletion(wrapUpRequest)
            //.Confirm("Are you sure: Yes or No ")
            .Build();
          }

         }
      }

1 Ответ

0 голосов
/ 04 октября 2018

На самом деле довольно просто отменить форму.Если вы введете «help» или «choices», вы увидите список встроенных команд формы, и одна из них - «quit».Есть много терминов, которые вы можете использовать, чтобы выйти, таких как «конец» или «пока».Если вы хотите определить свои собственные термины, вы можете настроить команды формы следующим образом:

var builder = new FormBuilder<BalanceForm>().Message
("We have to ask you some information")
    .Field(nameof(contract), validate: async (state, response) =>
    {
        var result = new ValidateResult();
        return result;
    })
    .OnCompletion(wrapUpRequest)

// Set the command term configuration on its own line
builder.Configuration.Commands[FormCommand.Quit].Terms = new[] { "exit", "cancel" };

return builder.Build();

Имейте в виду, что при отмене формы выдается FormCanceledException<T>.Если вы не хотите, чтобы это отображало сообщение типа «Извините, у моего бота-кода возникла проблема», вы можете поймать исключение следующим образом:

var balanca = new FormDialog<BalanceForm>(
            new BalanceForm(),
            BalanceForm.BuildForm,
            FormOptions.PromptInStart,
            result.Entities)
    .Catch<BalanceForm, FormCanceledException<BalanceForm>>((dialog, ex) =>
    {
        // Handle the cancellation here and return an IDialog<BalanceForm>
    });
...