2016-05-11 14 views
1

Ich versuche, mit dem Azure Bot Framework einen Bot zu erstellen, der nach einer unbekannten Menge komplexer Objekte fragt (jede benötigt drei Antworten). Aber ich weiß nicht, wie ich ein Formular für jedes der komplexen Objekte innerhalb der Rootform erstellen soll. Siehe http://docs.botframework.com/sdkreference/csharp/forms.html. Es heißt: "Um eine Liste komplexer Objekte zu behandeln, müssen Sie ein Formular für die oberste C# -Klasse und auch eine für das komplexe Objekt erstellen. Sie können das Dialog-System verwenden, um die Formulare zusammen zu erstellen." Das ist, was ich nicht tun kann.Azure Bot Framework FormFlow komplexe Formen

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(); 
    } 
} 

Controller:

[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); 
     } 
    } 

Antwort

2

Sie können Ihre Dialoge mit Methoden aus Chain Klasse zusammensetzen. Da auch diese Methoden LINQ-Syntax unterstützt, können Sie so etwas wie dies in Ihrem MakeRootDialog schreiben SupportRequest Dialog und Decalaration Dialog nacheinander auszuführen:

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)); 
    } 

Sie können auch Ketten Dialoge manuell wie folgt aus:

 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 Ich versuche es mit Methode eins, aber ich kann es nicht richtig machen. Wahrscheinlich sind es meine mangelnden Fähigkeiten in Linq, aber der Bot fragt nie nach einer Erklärung. – JurgenW

+0

@JurgenW, tatsächlich wird der Deklarationsdialog gestartet, erwartet jedoch, dass der Benutzer die erste Nachricht ausgibt. Wenn Sie also nach der Eingabe von SupportRequest etwas wie "Hallo" eingeben, sehen Sie, dass der Deklarationsdialog startet. Ich bin mir im Moment nicht 100% sicher, wie ich das beheben kann. –

+0

Hmm, das passiert mir nicht. Wenn ich der Bot-Klasse vom Typ List eine einzelne Eigenschaft hinzufüge, sagt der Bot sofort "Ist das deine Auswahl?" Das erste Mal, dass ich Hi sage. Es gibt für mich keine Möglichkeit, Eingaben hinzuzufügen. – JurgenW

Verwandte Themen