我目前正在寻找一种从数据库中预定义的值动态创建FormDialog
的方法。换句话说,我的字段类型,提示和设置都存储在数据库中,我试图实现的是读取这些设置并动态构建相应的表单。
到目前为止我尝试过的是类似于以下内容的内容。假设我的表单中包含名称(string
)和年龄(int
)字段(FieldDefinition
是I类创建用于存储字段的参数,假设它们是从数据库中提取的)(代码被剥离只是为了说明这个想法):
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();
}
所以问题就在这里:
我以为我可以使用dynamic
类型。但是,方法无法返回dynamic
对象,因为它在运行时确定。因此,当我尝试使用以下内容构建表单时出错:
dynamic values; var form = new FormDialog<dynamic>(values, ContactForm.BuildForm, FormOptions.PromptInStart, null);`
我需要动态创建对象的属性,因此我寻找一种在运行时创建Type
的方法。我最终得到了一些名为TypeBuilder
的东西,但如果它可以解决我的问题,我有点怀疑。
因此,我猜最终的开始是使用FieldReflector
,但我不知道如何实现这一点。我正在寻找与上述类似的东西,但确实有效。
答案 0 :(得分:0)
你看过 FormBuilderJson 吗?您可以动态构造.json字符串,并在运行时构建表单:
public static IForm<JObject> BuildJsonForm()
{
string fromFlowJson = GetFormFlowJson();
return new FormBuilderJson(schema)
.AddRemainingFields()
.Build();
}