2011-01-07 12 views
7

हाय मुझे पैरामीटर के रूप में मेरा Request.Form पास करने की आवश्यकता है, लेकिन पहले मुझे इसमें कुछ महत्वपूर्ण/मूल्य जोड़े जोड़ना होगा। मुझे अपवाद मिलता है कि संग्रह केवल पढ़ा गया है।अनुरोध को क्रमबद्ध करना। किसी शब्दकोश या कुछ

मैं कोशिश की है:

System.Collections.Specialized.NameValueCollection myform = Request.Form; 

और मैं एक ही त्रुटि मिलती है।

और मैं कोशिश की है: अगर मैं इसे एक और शब्दकोश में एक के बाद एक पारित कर सकते हैं

foreach(KeyValuePair<string, string> pair in Request.Form) 
{ 
    Response.Write(Convert.ToString(pair.Key) + " - " + Convert.ToString(pair.Value) + "<br />"); 
} 

परीक्षण करने के लिए, लेकिन मैं मिलता है:

System.InvalidCastException: निर्दिष्ट डाली नहीं है वैध।

कुछ मदद, कोई भी? Thanx

उत्तर

15

आपको string से string पर डालने की आवश्यकता नहीं है। NameValueCollection स्ट्रिंग कुंजियों और स्ट्रिंग मानों के आस-पास बनाया गया है। कैसे एक त्वरित विस्तार विधि के बारे में:

public static IDictionary<string, string> ToDictionary(this NameValueCollection col) 
{ 
    var dict = new Dictionary<string, string>(); 

    foreach (var key in col.Keys) 
    { 
    dict.Add(key, col[key]); 
    } 

    return dict; 
} 

इस तरह आप आसानी से जा सकते हैं:

var dict = Request.Form.ToDictionary(); 
dict.Add("key", "value"); 
+0

थेंक्स मैथ्यू, मैं कल इसे आजमाने की कोशिश कर रहा हूं। मैं समय के लिए छिपे हुए खेतों के साथ गया था। –

+0

मैथ्यू - अच्छा एक (और +1)। एक स्कॉट होने के नाते, नीचे एक छोटे LINQ का उपयोग कर इस पर मेरे stab का विरोध नहीं कर सका :)। नया साल मुबारक हो - parf ... :-) (बीटीडब्ल्यू, अभी आपके ब्लॉग का थोड़ा सा पठन है, regula और जावास्क्रिप्ट linq लेख पसंद है) बीटीडब्ल्यू, आप इस जावास्क्रिप्ट LINQ कार्यान्वयन http: //jslinq.codeplex की समीक्षा करना चाहेंगे .com/ –

1

आंद्रे,

तरीके के बारे में:

System.Collections.Specialized.NameValueCollection myform = Request.Form; 

IDictionary<string, string> myDictionary = 
    myform.Cast<string>() 
      .Select(s => new { Key = s, Value = myform[s] }) 
      .ToDictionary(p => p.Key, p => p.Value); 

LINQ का उपयोग करता है यह सब रखने के लिए एक 'लाइन' पर। इस का एक विस्तार विधि के लिए exrapolated जा सकता है:

public static IDictionary<string, string> ToDictionary(this NameValueCollection col) 
{ 
    IDictionary<string, string> myDictionary = new Dictionary<string, string>(); 
    if (col != null) 
    { 
     myDictionary = 
      col.Cast<string>() 
       .Select(s => new { Key = s, Value = col[s] }) 
       .ToDictionary(p => p.Key, p => p.Value); 
    } 
    return myDictionary; 
} 

आशा है कि यह मदद करता है ..

+0

इसे सरल रखें, हे? :) – jgauffin

+0

हे हे, ऐ - :)। मैं कभी-कभी linq के साथ इसे अधिक करते हैं। असल में, मुझे एक दुविधा मिली है क्योंकि मुझे एक नया मौका दिया गया है जिसे एलएएमपी स्टैक पर प्रावधान किया जाना है और मुझे आश्चर्य है कि मैं linp के बिना php5 ऑब्जेक्ट्स में कैसे सामना करूंगा :) (जैसा कि मैंने यह http देखा : //phplinq.codeplex.com/) –

3
public static IEnumerable<Tuple<string, string>> ToEnumerable(this NameValueCollection collection) 
{ 
    return collection 
     //.Keys 
     .Cast<string>() 
     .Select(key => new Tuple<string, string>(key, collection[key])); 
} 

या

public static Dictionary<string, string> ToDictionary(this NameValueCollection collection) 
{ 
    return collection 
     //.Keys 
     .Cast<string>() 
     .ToDictionary(key => key, key => collection[key])); 
} 
9

अपने पहले से ही MVC का उपयोग कर तो आप 0 लाइनों के साथ यह कर सकते हैं कोड का

using System.Web.Mvc; 

var dictionary = new Dictionary<string, object>(); 
Request.Form.CopyTo(dictionary); 
संबंधित मुद्दे