2016-05-11 2 views
1

Я пытаюсь создать бот с Azure Bot Framework, который будет запрашивать неизвестное количество сложных объектов (каждый из них потребует трех ответов). Но я не знаю, как создать форму для каждого из сложных объектов в корневой форме. См. http://docs.botframework.com/sdkreference/csharp/forms.html. В нем указано: «Чтобы обрабатывать список сложных объектов, вам нужно создать форму для класса верхнего уровня C#, а также одного для сложного объекта. Вы можете использовать систему Dialogs для составления форм вместе». Вот что я не знаю, как это сделать.Azure Bot Framework FormFlow сложные формы

public enum SystemSelection { SharePoint, BizTalk, Azure, Office365 }; 

public enum RequestType { Bug, SupportRequest, Question }; 

public enum Importance { Blocking, High, Medium, Low }; 

[Serializable] 
class Declaration 
{ 
    public string Type; 
    public string Amount; 
    public string Date; 

    public static IForm<Declaration> BuildForm() 
    { 
     return new FormBuilder<Declaration>() 
       .Message("Add a declaration") 
       .Build(); 
    } 
} 

[Serializable] 
class SupportRequest 
{ 

    public SystemSelection? SystemSelection; 
    public RequestType? RequestType; 
    public Importance? Importance; 

    public List<Declaration> Declarations; 

    public static IForm<SupportRequest> BuildForm() 
    { 
     IForm<Declaration> aForm = new FormBuilder<Declaration>().Message("Add declaration").Build(); 

     // now what? 

     return new FormBuilder<SupportRequest>() 
       .Message("Welcome to the simple support bot!") 
       .Build(); 
    } 
} 

Контроллер:

[BotAuthentication] 
    public class MessagesController : ApiController 
{ 
    internal static IDialog<SupportRequest> MakeRootDialog() 
    { 
     // change something here?? 
     return Chain.From(() => FormDialog.FromForm(SupportRequest.BuildForm)); 
    } 

    public async Task<Message> Post([FromBody]Message message) 
    { 
     if (message.Type == "Message") 
     { 
      return await Conversation.SendAsync(message, MakeRootDialog); 
     } 
     else 
     { 
      return HandleSystemMessage(message); 
     } 
    } 

ответ

2

Вы можете создавать свои Диалоги с использованием методов из Chain класса. Поскольку эти методы также поддерживают синтаксис LINQ, вы можете написать что-то подобное в вашей MakeRootDialog выполнить SupportRequest диалог и Decalaration диалог в последовательности:

internal static IDialog<SupportRequest> MakeRootDialog() 
    { 
     var dlg = from x in FormDialog.FromForm(SupportRequest.BuildForm) 
        from y in FormDialog.FromForm(Declaration.BuildForm) 
        select x; 
     return dlg; 
     // return Chain.From(() => FormDialog.FromForm(SupportRequest.BuildForm)); 
    } 

Вы можете также цепные диалоги вручную, как это:

 var dlg = Chain.From(() => FormDialog.FromForm(SupportRequest.BuildForm)) 
      .ContinueWith<SupportRequest,Declaration>(async (ctx, sr) => 
      { 
       var res = await sr; 
       return FormDialog.FromForm(Declaration.BuildForm); 
      }); 
+0

I Я пытаюсь сделать это с помощью метода один, но я не могу получить его полностью правильно. Вероятно, это мои недостающие навыки в Linq, но бот никогда не просит ввести Декларацию. – JurgenW

+0

@JurgenW, на самом деле начинается диалог декларации, но он ожидает, что пользователь скажет первое сообщение. Поэтому, если вы введете что-то вроде «Привет» после входа в SupportRequest, вы увидите, что диалог диалога начинается. На данный момент я не уверен на 100%, как это исправить. –

+0

Хмм, это не для меня. Когда я добавляю одно свойство в класс бота типа List , бот сразу же говорит «Это ваш выбор?» В первый раз, когда я говорю «Привет». У меня нет возможности добавлять входные данные. – JurgenW