Не могли бы вы помочь мне с любой идеей, как один раз спросить номер контракта и использовать во всех моих диалогах и формах?
Исходя из вашего требования, я создаю образец, чтобы запросить у пользователя номер контракта, и сохраню значение в UserData , чтобы я мог получить номер контракта, предоставленный пользователем из UserData в дочерний диалог (ы). Следующий пример кода для справки.
В RootDialog:
[Serializable]
public class RootDialog : IDialog<object>
{
public Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
return Task.CompletedTask;
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
// calculate something for us to return
int length = (activity.Text ?? string.Empty).Length;
var contractnumber = "";
if (!context.UserData.TryGetValue<string>("contract_number", out contractnumber))
{
//prompt for contract number
PromptDialog.Text(
context: context,
resume: AfterGetContractNumber,
prompt: "Please provide your contract number.",
retry: "Please try again."
);
}
else
{
await context.Forward(new BaiscLuisDialog(), AfterLuisDialog, context.Activity, CancellationToken.None);
}
}
private async Task AfterGetContractNumber(IDialogContext context, IAwaitable<string> result)
{
string contractnumber = await result;
context.UserData.SetValue<string>("contract_number", contractnumber);
await context.PostAsync($"OK, received your contract number: {contractnumber}.");
context.Done(this);
}
private async Task AfterLuisDialog(IDialogContext context, IAwaitable<object> result)
{
context.Wait(MessageReceivedAsync);
}
}
В BaiscLuisDialog:
[LuisIntent("balance")]
public async Task BalanceIntent(IDialogContext context, LuisResult result)
{
//call BalanceForm
//and pass contract number that user provided to BalanceForm contract_number
var balanca = new Microsoft.Bot.Builder.FormFlow.FormDialog<BalanceForm>(new BalanceForm() { contract_number = context.UserData.GetValue<string>("contract_number") },
BalanceForm.BuildForm,
Microsoft.Bot.Builder.FormFlow.FormOptions.PromptInStart,
result.Entities);
context.Call<BalanceForm>(balanca, BalanceCompleted);
}
private async Task BalanceCompleted(IDialogContext context, IAwaitable<BalanceForm> result)
{
context.Wait(MessageReceived);
}
В BalanceForm:
[Serializable]
public class BalanceForm
{
public string contract_number;
[Prompt("What is your contract number?")]
public string contract;
public string your_other_field;
public static IForm<BalanceForm> BuildForm()
{
OnCompletionAsyncDelegate<BalanceForm> wrapUpRequest = async
(context, state) =>
{
//using (BotModelDataContext BotDb = new BotModelDataContext())
//{
// //search in database
// string wrapUpMessage = "Dear " + house.Firstname + "," + "your balance is " + house.Balance;
// await context.PostAsync(wrapUpMessage);
//};
//your code logic here
var contractnumber = "";
context.UserData.TryGetValue<string>("contract_number", out contractnumber);
string wrapUpMessage = " Form completed! Your contract number is " + contractnumber;
var replymes = context.MakeMessage();
replymes.Text = wrapUpMessage;
await context.PostAsync(replymes);
};
return new FormBuilder<BalanceForm>()
.Message("We have to ask you some information")
.Field(new FieldReflector<BalanceForm>(nameof(contract)).SetActive(state => state.contract_number == null))
.Field(nameof(your_other_field))
.OnCompletion(wrapUpRequest)
//.Confirm("Are you sure: Yes or No ")
.Build();
}
}
Результат теста:
![enter image description here](https://i.stack.imgur.com/54RZw.png)