来自动态 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();
}

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

"{
nt"d":  {
ntt"parameters":  [
{
nttt"id":  "url",
nttt"name":  "Site URL",
nttt"required":  "text"
},
{
nttt"id":  "title",
nttt"URL":  "Title",
nttt"required":  true,
nttt"example":  "www.stackoverflow.com"ntt
}
]nt
}n
}"

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

不可能

好吧,经过更多的研究,我发现我想要实现的目标几乎是不可能的。 无法动态添加字段,也无法同时使用机器人框架添加静态字段。因此,在这种情况下,表单生成器不是一个现实的可能性。正如 Eric Dahlvang 所提到的:当您仅通过带有表单构建器的 JSON 模式使用 JSON 时,这是可能的。

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

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

全局定义字符串列表,或者像我使用的那样"参数对象":

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# 对象(参数)。稍后我使用全局列表来访问参数。然后我提示了第一个问题(参数),以便循环开始。作业包含解析的 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.
}
}

相关内容

  • 没有找到相关文章

最新更新