来自动态 JSON 的表单生成器字段

Form builder fields from dynamic JSON

我想用手动添加和动态添加的字段填充表单。

public class ModelClass
{
    [Prompt("URL?")]
            public string URL { get; set; }
            [Prompt("Name?")]
            public string Title { get; set; }
}

表单生成器:

 public IForm<ModelClass> BuildApplyform()
        {
            var builder = new FormBuilder<ModelClass>(); 
            // Parse string to json for usage in the foreach
            dynamic json = JObject.Parse(jsonString);

            builder.Message("Form builder");
            builder.Field(nameof(ModelClass.Title), active: (state) => false);
            builder.Field(nameof(ModelClass.URL), active: (state) => false);
            foreach(string param in json.Parameters)
            {
                builder.Field(param);
            }
            return builder.Build();
        }

JSON字符串非常动态,每次都可能不同。但是,该字符串始终包含 "d" 和 "parameter" 子节点。 该字符串可能如下所示:

"{
  \n\t\"d\":  {
    \n\t\t\"parameters\":  [
      {
        \n\t\t\t\"id\":  \"url\",
        \n\t\t\t\"name\":  \"Site URL\",
        \n\t\t\t\"required\":  \"text\"
      },
       {
        \n\t\t\t\"id\":  \"title\",
        \n\t\t\t\"URL\":  \"Title\",
        \n\t\t\t\"required\":  true,
        \n\t\t\t\"example\":  \"www.whosebug.com\"\n\t\t
      }
    ]\n\t
  }\n
}"

我如何确保无论 JSON 是什么样子,参数都作为字段输入动态添加到表单生成器中? 提前致谢。

不可能

好吧,经过更多的研究,我发现我想要实现的目标几乎是不可能的。 无法使用 Bot Framework 动态添加字段和同时添加静态字段。因此,在 Eric Dahlvang 提到的 case.As 中,Formbuilder 并不是一个现实的可能性:当您仅通过带有 Form Builder 的 JSON 模式使用 JSON 时,这是一种可能性。

我是如何解决这个问题的:

在寻找使用 Form Builder 的过程中,我偶然发现了一个循环提示对话框的解决方案。可以读取 JSON 并将其转换为 C# 对象以便迭代它们,那么为什么不使用它呢?

全局定义一个字符串列表,或者像我使用的那样"Parameter object":

public class Parameter
{
    public string Id { get; set; }
    public string Title { get; set; }
    public bool Required { get; set; }
    public string Example { get; set; }
}

然后您必须获取 JSON 参数并将它们转换为 C# 对象(参数)。稍后我使用全局列表访问参数。然后我提示第一个问题(参数)所以循环 starts.The 作业包含解析的 JSON.

    public void SomeFunction(IDialogContext context)
{
        if (job["d"]["parameters"] != null)
                    {
                        var t = job["d"]["parameters"];
                        parameters = GetParametersFromJSON(t); // parameters is a globally defined list of <Parameter>
                    }
                    currentParameter = parameters[0];
                    PromptDialog.Text(context, ParamPrompt, "Please fill in: " + currentParameter.Title+ $", for example: {currentParameter.sampleValue}");
}



private async Task ParamPrompt(IDialogContext context, IAwaitable<string> 
result)
{
    var answer = await result;

        index++;
        if (index < parameters.Count)
        {
            currentParameter = parameters[index];
            PromptDialog.Text(context, ParamPrompt, "Please fill in: " + currentParameter.Title + $", for example: {currentParameter.example}");
        }
       else 
       {
           // handle logic, the loop is done.
       }
    }