所以这就是我想要做的。我想要一个短语列表,并在短语的某些部分,表明用户输入是必需的..无论是下拉列表,文本框,日期字段等。有点像Madlibs在某种程度上..但可以选择列表中的内容。
例如:
我拥有
?list_of_cars?
,我是在?date?
购买的。它有?freetext?
在它上面。
此字符串被分解为文本和HTML表单字段/ ASP.net控件的混合。
?list_of_cars?
会变成一个下拉列表,其中包含一些可供选择的选项。
?date?
变为日期字段(我创建的自定义用户控件)
?freetext?
只是一个用户可以输入信息的文本框。
我需要使用这些短语中的大约50个。最终结果是,在用户填写所需输入后,它们最终将成为文本框中的纯文本。
没有列表需要大量选项..汽车是一个不好的例子。列表中包含的最多选项可能是5。
此时,我开始将整个字符串与多个分隔符和占位符一起存储到数据库表中。
例如,一行如下所示:
我拥有
{list^Nissan,Ford,Chevy}
,我是在{date}
购买的。它上面有{text}
英里。
然后我将其分解并用表单字段替换占位符..然后将它们全部重新组合成纯文本。我觉得可能有更聪明/更好的方法来做到这一点。我并不反对备份和更改初始短语的存储方式。
只是好奇是否有人可能有任何提示/建议?
答案 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) }
}
我不知道,只是在想......