2011-01-07 13 views
7

Merhaba, Request.Form'umu parametre olarak iletmem gerekiyor, ancak önce bir anahtar/değer çifti eklemeliyim. Koleksiyonun salt okunur olduğunu anladım.Serializing Request.Form bir Sözlüke veya bir şeye

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

ve ben aynı hatayı alıyorum:

denedim.

ve ben denedim: ben başka sözlüğe tek bir geçişte eğer

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

test etmek, ama olsun:

System.InvalidCastException: Belirtilen dökme değil geçerli.

Bazı yardımlarınız var mı? Thanx

cevap

15

string ürününü string ürününe aktarmanıza gerek yoktur. NameValueCollection, dize anahtarları ve dize değerleri etrafında oluşturulur. Hızlı bir uzantısı yöntemi hakkında nasıl:

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

Bu şekilde kolayca gidebilirsiniz:

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

thanx Matthew, yarın denemeye çalışacağım. Şu an için gizli alanlara gittim. –

+0

matthew - güzel olan (ve +1). Bir scot olmak, biraz LINQ kullanarak aşağıda benim budama direnemedi :). mutlu yeni yıl - parf ... :-) (btw, biraz şimdi blogunuzu okuyarak, regula ve javascript linq makalelerini beğenerek) btw, bu javascript LINQ uygulamasını gözden geçirmek isteyebilirsiniz http: //jslinq.codeplex .com/ –

1

Andre,

hakkında nasıl:

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 kullanan tüm tutmak bir 'çizgi' üzerinde. senin zaten MVC kullanarak, o zaman 0 hatları ile bunu yapabilir .. bu yardımcı olur

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

umut

+0

basit olsun, eeh? :) – jgauffin

+0

hee hee, aye - :). bazen linq ile aşırıya kaçırım. Aslında, LAMP yığınının sağlanması gereken ve yeni bir fırsat sunduğum gibi bir dilema var ve ben nasıl linq olmadan php5 nesneleri başa çıkacağını merak ediyorum :) (Ben bu http görmedim : //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])); 
} 

veya

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

: Bu bir uzantısı yöntemine exrapolated olabilir kodun

using System.Web.Mvc; 

var dictionary = new Dictionary<string, object>(); 
Request.Form.CopyTo(dictionary); 
İlgili konular