从数据字符串生成动态表单字段的技巧

本文关键字:字段 表单 动态 数据 字符串 | 更新日期: 2023-09-27 18:14:46

这就是我要做的。我想取一个短语列表,并在短语的某些部分指出需要用户输入。可以是下拉列表、文本框、日期字段等。在某种程度上有点像Madlibs…但是可以从列表中选择。

例如:

我拥有一个?list_of_cars?,我在?date?上购买它。它有?freetext?路途遥远。

这个字符串被分解成文本和HTML表单字段/ASP.net控件的混合物。

?list_of_cars?变成了一个下拉列表,有几个选项可供选择。

?date?变成日期字段(我创建的自定义用户控件)

?freetext?只是一个文本框,用户可以在里面输入信息。

我有大约50个这样的短语需要使用。最终的结果是,在用户填写了所需的输入后,它们将在文本框中以纯文本形式结束。

没有列表需要大量的选项…汽车是一个不好的例子。一个列表最多可能包含5个选项。

现在,我开始将整个字符串以及一些分隔符和占位符存储到一个数据库表中。

例如,其中一行看起来像这样:

我有一个{list^Nissan,Ford,Chevy},我在{date}上买的。它有{text}英里。

然后我将其分解并用表单字段替换占位符。然后把它们重新组合成纯文本。我觉得可能有一个更聪明/更好的方法来做这件事。我不反对备份和更改初始短语的存储方式。

只是好奇是否有人可能有任何提示/建议?

从数据字符串生成动态表单字段的技巧

以下是您必须考虑的不同方面的一些细节

存储列表

我建议您创建两个表List (ListID, ListName)和ListItem (ListID, ItemName),并将这些数据保存在数据库中,以便于维护。如果你有几个相等的汽车列表,你需要稍后更新,这将使事情变得容易。另一方面,更新多个字符串并不像这样容易。

标记

需要使它们易于解析。我会避免使用复杂的名称,如"{list^Nissan,Ford,Chevy}",并将其定义为?list_ID?所有标签都需要易于识别。也许tag_name ?这不是一个好主意,因为您将有可能使解析更加困难的问号。最好使用#!tag_name!#

ASP。

所有控件都需要添加到OnInit方法中,而不是在Page_Load中添加。

这里有一些东西可以让你开始,但需要更多的工作。

private const string OPEN_TAG = "!#";
private const string CLOSE_TAG = "#!";
private void Parse(string s)
{        
    int tagOpenIndex = 0;
    int tagCloseIndex = 0;
    tagOpenIndex = s.IndexOf(OPEN_TAG);
    string tag = string.Empty;
    while (tagOpenIndex >= 0)
    { 
        //Write everything before current tag opening 
        Response.Write(s.Substring(tagCloseIndex, tagOpenIndex));
        //Find where current tag is closing 
        tagCloseIndex = s.IndexOf(CLOSE_TAG, tagOpenIndex);
        //Get tag name
        tag = s.Substring(tagOpenIndex, tagCloseIndex - tagOpenIndex + 1);
        //Parse tag and create asp.net controls. Let's say this is a text box
        //You'll need to figure out where to put this and such
        //And also how to keep track of different control IDs so you can use these later.
        TextBox t = new TextBox();
        t.ID = "Generate some ID";
        Form.Controls.Add(t);
        //Get the index of next open tag
        tagOpenIndex = s.IndexOf(OPEN_TAG, tagCloseIndex);
    }
}

我将遵循与您的方法类似的方法,但是您将创建一个可以读取编辑器类型和可用值的控件。

我也会使用字符串将它们分开存储。这样你就可以重复使用

那么我将有一个类有两个属性

class RequiredInput
{
    public property string Phrase { get; set;}
    public property Field[] Fields { get; set;}
}
class Field
{
    public Type Type { get; set;}
    public object Default { get; set;}
    public object[] options { get; set;}
}

然后我会写下解析器,就像这样:

var sentence = new RequiredInput();
sentence.Phrase = "I own a {0}, I purchased it on {1}. It has {2} miles on it.";
sentece.options = new Field[] { 
    new field(typeof(ComboBox), new string[] { "Car1", "Car2", "Car3"}),
    new field(typeof(DateEdit), DateTime.Now),
    new field(typeof(TextEdit), String.Empty) }
}

我不知道,只是在想....