.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.
}
}