来自动态 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.
}
}
我想用手动添加和动态添加的字段填充表单。
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.
}
}