2011-01-07 8 views
7

Witam muszę przekazać moje Request.Form jako parametr, ale najpierw muszę dodać kilka par klucz/wartość do niego. Dostaję wyjątek, że Kolekcja jest tylko do odczytu.Serializing Request.Form do słownika lub coś takiego

Próbowałem:

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

i uzyskać ten sam błąd.

i próbowałem:

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

aby sprawdzić, czy mogę przekazać je jeden po drugim do innego słownika, ale ja dostać:

System.InvalidCastException: Określony obsada nie jest ważny.

trochę pomocy, ktoś? Thanx

Odpowiedz

15

Nie trzeba przesyłać od string do string. NameValueCollection jest zbudowany wokół kluczy strunowych i wartości łańcuchów. Jak o szybką metodę rozszerzenia:

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

ten sposób można łatwo przejść:

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

thanx Matthew, zamierzam spróbować jutro. Poszedłem z ukrytymi polami. –

+0

matthew - ładny (i +1). będąc szkotem, nie mogłem się oprzeć mojemu ukłuciu na tym dole używając trochę LINQ :). Szczęśliwego Nowego Roku - parf ... :-) (przy okazji trochę czytając twojego bloga właśnie teraz, lubiącego regula i javascriptowe artykuły linq) btw, możesz chcieć przejrzeć tę implementację LINQ javascript http: //jslinq.codeplex .com/ –

1

Andre

jak about:

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

używa LINQ to wszystko utrzymać na jednej "linii". to może być exrapolated do metody wydłużania:

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

nadziei, że to pomoże ..

+0

czy to proste, prawda? :) – jgauffin

+0

hee hee, aye - :). czasami przesadzam z linq. w rzeczywistości mam dylemat, ponieważ zaoferowano mi nową możliwość, która musi być obsłużona na stosie LAMP i zastanawiam się, jak poradzę sobie w obiektach php5 bez linq :) (tak, widziałem to na http : //phplinin.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])); 
} 

lub

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

Jeśli urządzenie korzysta już MVC następnie można to zrobić z linii 0 kodu.

using System.Web.Mvc; 

var dictionary = new Dictionary<string, object>(); 
Request.Form.CopyTo(dictionary); 
Powiązane problemy