2009-08-07 41 views
3

我正在使用Request.Form搜索控件名稱。在Request.Form中搜索控件/分析NameValueCollection

當然,我知道你可以使用AllKeys迭代所有的值,並且你也可以做Form [「controlName」]。

但是我的一些控件名稱是動態的,這將是能夠做的東西一樣有用:

1)獲得控件的子集的集合衛生組織的名字開始具有一定的前綴 2)搜索用於匹配模式的控件名稱,就像使用正則表達式一樣。

但我沒有辦法看到做這樣的事情。

N.B我知道如何使用FindControl for ASP.NET控件,但這些都是標準的HTML。

回答

7

如果您使用的是C#3,則可以使用LINQ和擴展方法以非常好的方式實現此目的。首先,你需要在this thread創建由Bryan Watts設計了一個擴展方法:

public static IEnumerable<KeyValuePair<string, string>> ToPairs(this NameValueCollection collection) 
{ 
    if (collection == null) 
    { 
     throw new ArgumentNullException("collection"); 
    } 
    return collection.Cast<string>().Select(key => new KeyValuePair<string, string>(key, collection[key])); 
} 

現在,假設你有一個這樣的形式:

<form id="form1" runat="server"> 
<div> 
    <input type="text" name="XXX_Name" value="Harold Pinter" /> 
    <input type="text" name="XXX_Email" value="[email protected]" /> 
    <input type="text" name="XXX_Phone" value="1234 5454 5454" /> 

    <input type="text" name="YYY_Name" value="AN. Other" /> 
    <input type="text" name="YYY_Email" value="[email protected]" /> 
    <input type="text" name="YYY_Phone" value="8383 3434 3434" /> 

    <input type="submit" value="submit button" /> 
</div> 
</form> 

你可以在你的代碼隱藏做到這一點:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var data = Request.Form.ToPairs().Where(k => k.Key.StartsWith("XXX_")); 

    foreach (var item in data) 
    { 
     Response.Write(String.Format("{0} = '{1}', ", item.Key, item.Value)); 
    } 
} 

將輸出:

XXX_Name = 'Harold Pinter' 
XXX_Email = '[email protected]' 
XXX_Phone = '1234 5454 5454' 
0

只要通過Request.Form.AllKeys循環,就可以在鍵名上做任何你想要的模式,然後如果它匹配,你可以將值拉出。

foreach (var key in Request.Form.AllKeys) 
{ 
    if (key.StartsWith("abc")) 
    { 
     var value = Request.Form[key]; 
     Do_Something(key, value); 
    } 
} 
0

不要使用foreach(Request.Form.AllKeys中的var鍵)。在我面前,我有一個缺陷,那就是關鍵不在評估什麼。在Request.Form.AllKeys中使用字符串鍵是安全的。