2013-05-21 18 views
0

所以這就是我想要做的。我想要一個短語列表,並在短語的某些部分,表明用戶輸入是必需的。無論是下拉列表,文本框,日期字段等。有點像Madlibs的方式..但可以從列表中選擇東西。關於從一串數據生成動態表單域的提示?

例如:

我自己的?list_of_cars?,我購買它?date?。它有?freetext? 英里。

該字符串被分解爲文本和HTML表單字段/ ASP.net控件的混合。

?list_of_cars?變成一個下拉列表,有幾個選項可供選擇。

?date?被變成了一個日期字段(自定義用戶控件,我創建)

?freetext?很簡單,用戶可以將信息輸入到一個文本框。

我有大約50個需要處理的這些短語。最終的結果是,在用戶填寫所需的輸入後,它們最終會在文本框中顯示爲純文本。

沒有列表需要大量的選項..汽車是一個壞榜樣。列表可能包含的最多選項可能是5。

在這一點上,我開始將整個字符串與一些分隔符和佔位符存儲到數據庫表中。

例如,一個行看起來是這樣的:

我自己的{list^Nissan,Ford,Chevy},我購買它{date}。它有{text}英里。

然後我分解它,用表單域代替佔位符,然後把它們全部放回純文本。我覺得可能有一個更聰明/更好的方法來做到這一點。我不反對備份並更改最初的短語存儲方式。

只是好奇,如果任何人可能有任何提示/建議?

+0

我首先考慮如何分離零件。如何字段名稱,某種類型,或許一些格式化信息。 '{Car Make | list:carmake | n/a}'可能是'Car Make'的提示字段,如果NULL輸出爲「n/a」,則選項來自表格中的下拉列表。包含所有列表選項的表格可以包含列表選擇器(「carmake」),選擇等級(1,2,3,...)和選項(「Saab」,「Unimog」,「Volvo」,...)。在許多形式中,您需要允許多次出現某種類型,例如開票ZIP和運送ZIP。考慮處理複數:'{狗| int:狗:狗|孤獨}'。 – HABO

回答

1

這裏有一些細節的不同方面,你必須想

存儲列表

的我建議你創建兩個表列表(ListID,LISTNAME)和列表項(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); 
    } 
} 
+0

我喜歡這個答案,因爲您通過短語字符串掃描的方法,謝謝。我最初使用'Regex.Split',但我更喜歡你的方法。 – user1003916

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

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