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

.net 来自动态JSON的表单生成器字段,.net,json,botframework,formflow,.net,Json,Botframework,Formflow,我想用手动添加和动态添加的字段填充表单 public class ModelClass { [Prompt("URL?")] public string URL { get; set; } [Prompt("Name?")] public string Title { get; set; } } Formbuilder: public IForm<ModelClass> BuildApplyform(

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

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

 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看起来如何,参数都作为字段输入动态添加到表单生成器中?
提前感谢。

不可能

好吧,经过更多的研究,我发现我想要达到的目标实际上是不可能的。 在Bot框架中,不可能动态添加字段,也不可能同时添加静态字段。因此,在这种情况下,formbuilder不是一种现实的可能性。正如Eric Dahlvang所提到的:当您仅通过formbuilder的JSON模式使用JSON时,这是一种可能性

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

在我使用FormBuilder的搜索过程中,我偶然发现了一个通过promptdialog循环的解决方案。可以读取JSON并将其转换为C#对象,这样您就可以迭代它们,为什么不使用它呢

全局定义字符串列表,或如我使用的“参数对象”:

然后您必须获取JSON参数并将其转换为C#对象(参数)。后来我使用了一个全局列表来访问参数。然后我提示第一个问题(参数),这样循环就开始了

    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.
       }
    }
public函数(IDialogContext上下文)
{
if(作业[“d”][“参数”!=null)
{
var t=作业[“d”][“参数”];
parameters=GetParametersFromJSON(t);//参数是全局定义的
}
currentParameter=参数[0];
Text(上下文,ParamPrompt,“请填写:“+currentParameter.Title+$”,例如:{currentParameter.sampleValue}”);
}
专用异步任务参数提示符(IDialogContext上下文,IAwaitable
结果)
{
var应答=等待结果;
索引++;
if(索引<参数计数)
{
currentParameter=参数[索引];
Text(上下文,ParamPrompt,“请填写:“+currentParameter.Title+$”,例如:{currentParameter.example}”);
}
其他的
{
//处理逻辑,循环完成。
}
}

是否要动态定义字段值并将字段值存储在JSON文件中?我希望用户动态填写JSON文件中的字段值(如id:、required:和example:)。因此,它们需要通过JSON文件动态地添加到表单中,因为每个JSON文件都有一点不同。我认为您不能像那样动态地向formflow添加字段。我认为您需要使用Microsoft.Bot.Builder.FormFlow.Json定义整个表单。这里可以找到一些文档:谢谢您的回复。这意味着我不能同时使用硬编码字段和JSON,对吗?我想您需要一个自定义版本:它将底层表单类与.JSON文件相结合
public class Parameter
{
    public string Id { get; set; }
    public string Title { get; set; }
    public bool Required { get; set; }
    public string Example { get; set; }
}
    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.
       }
    }