从一串数据生成动态表单字段的提示?

时间:2013-05-21 01:35:38

标签: c# asp.net sql-server vb.net sql-server-2005

所以这就是我想要做的。我想要一个短语列表,并在短语的某些部分,表明用户输入是必需的..无论是下拉列表,文本框,日期字段等。有点像Madlibs在某种程度上..但可以选择列表中的内容。

例如:

  

我拥有?list_of_cars?,我是在?date?购买的。它有?freetext?   在它上面。

此字符串被分解为文本和HTML表单字段/ ASP.net控件的混合。

?list_of_cars?会变成一个下拉列表,其中包含一些可供选择的选项。

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

?freetext?只是一个用户可以输入信息的文本框。

我需要使用这些短语中的大约50个。最终结果是,在用户填写所需输入后,它们最终将成为文本框中的纯文本。

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

此时,我开始将整个字符串与多个分隔符和占位符一起存储到数据库表中。

例如,一行如下所示:

  

我拥有{list^Nissan,Ford,Chevy},我是在{date}购买的。它上面有{text}英里。

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

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

2 个答案:

答案 0 :(得分:1)

以下是您需要考虑的不同方面的一些细节

存储列表

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

<强>代码

需要进行这些操作以便于解析。我会避免复杂的名字,如“{list ^ Nissan,Ford,Chevy}”,并将其定义为?list_ID?。所有标签都需要易于识别。也许?tag_name?这不是一个好主意,因为你会有一些问题标记可能会使解析更加困难。最好使用#!tag_name!#

之类的东西

<强> ASP.NET

需要将所有控件添加到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);
    }
}

答案 1 :(得分:0)

我会按照与你类似的方法,但是你创建了一个可以读取编辑器类型和可用值的控件。

而且我也会使用String.Format将它们分开存储,这样你可以重复使用

所以我会有一个有两个属性的类

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) }
}

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