表单流的动态返回类型



我目前正在寻找一种从数据库中预定义的值动态创建FormDialog的方法。换句话说,我的字段类型、提示和设置都存储在数据库中,我试图实现的是读取这些设置并动态构建适当的表单。

到目前为止,我尝试的内容类似于以下内容。假设我有一个带有名称(string(和一个年龄(int(字段的表单(FieldDefinition是我创建的用于存储字段参数的类,假设它们是从数据库中获取的((剥离代码只是为了说明这个想法(:

public static IForm<dynamic> BuildForm()
{
string FormMessage = "Welcome to demo contact form!";
string CompletionMessage = "Thank your for your info. Our team will contact you as soon as possible.";
var fields = new List<FieldDefinition>()
{
new FieldDefinition()
{
Name = "Name",
FieldType = typeof(string),
Prompts = new string[] { "What's your name?", "Please input your name" }
},
new FieldDefinition()
{
Name = "Age",
FieldType = typeof(int),
Prompts = new string[] { "What's your age?", "How old are you?" }
}
};

var builder = new FormBuilder<dynamic>();
builder.Message(FormMessage);
foreach (var f in fields)
{
builder.Field(
new FieldReflector<dynamic>(f.Name)
.SetType(f.FieldType)
);
}
builder.AddRemainingFields()
.OnCompletion(async (context, order) => {
var message = context.MakeMessage();
message.Text = CompletionMessage;
await context.PostAsync(message);
});
return builder.Build();
}

所以这就是问题所在:

  1. 以为我可以使用dynamic类型。但是方法不能返回dynamic对象,因为它是在运行时确定的。因此,当我尝试使用以下方法构建表单时,我遇到了错误:

    dynamic values; var form = new FormDialog<dynamic>(values, ContactForm.BuildForm, FormOptions.PromptInStart, null);`
    
  2. 我需要动态创建对象的属性,因此我寻找了一种在运行时创建Type的方法。我最终得到了一种叫做TypeBuilder的东西,但我有点怀疑它是否能解决我的问题。

因此,我想最终的开始是使用FieldReflector但我不知道如何实现这一目标。我正在寻找与上述类似的东西,但这确实有效。

你看过FormBuilderJson吗? 您可以动态构造 .json 字符串,并在运行时构建表单:

public static IForm<JObject> BuildJsonForm()
{
string fromFlowJson = GetFormFlowJson();
return new FormBuilderJson(schema)
.AddRemainingFields()
.Build();
}

有关更多信息,请参阅此处:https://learn.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-formflow-json-schema?view=azure-bot-service-3.0

相关内容

  • 没有找到相关文章

最新更新