2011-02-03 10 views
7

Czy jest jakiś niezły sposób podziału FormCollection na , który zawiera tylko te klucze, które zaczynają się od określonego ciągu?Krojenie kolekcji FormCollection za pomocą klawiszy rozpoczynających się od określonego ciągu znaków

(To pytanie jest w zasadzie taka sama jak this-> ale dla C#/FormCollection zamiast pytona Slicing a dictionary by keys that start with a certain string)

oto co wymyśliłem, aby obejść ten problem:

public ActionResult Save(FormCollection formCollection) { 
    var appSettings = new Dictionary<string, string>(); 
    var appKeys = formCollection.AllKeys.Where(k => k.StartsWith("AppSettings.")); 
    foreach (var key in appKeys) 
    { 
     appSettings[key] = formCollection[key]; 
    } 
... 

Edycja: Problem z tym kodem polega na tym, że muszę to zrobić wiele razy dla różnych ciągów StartSweith, i dlatego będę musiał stworzyć metodę "narzędzia", ​​aby to zrobić. Byłoby miło, gdyby mógł przeczytać w jednej linii jak:

formCollection.Where(k=>k.Key.StartsWith("AppSettings."); 

tle (nie konieczne, aby rozwiązać problem): Kontekst jest asp.net mvc, i postaci z dynamicznym słownika pola. Jest to podobne do tego pytania - Return FormCollection items with Prefix - ale nie do końca takie samo.

I po przeczytaniu tej odpowiedzi How to build C# object from a FormCollection with complex keys - Zacząłem się zastanawiać, czy nie byłoby lepiej, nawet nie używając formularza post, ale wysyłając JSON zamiast tego.

+0

Co jest nie tak z kodem, który masz? –

+0

Pamiętaj, że zawsze powinieneś opisać * problem *. Tutaj brzmi tak, jakbyś mówił: "Robię coś, i tak to robię. Czy jest to dobry sposób na zrobienie tego?", Ale nie mówię nam, dlaczego twoje obecne rozwiązanie jest * nie miłe *. –

+0

Dzięki, zredagowałem pytanie, aby powiedzieć, dlaczego nie jest ono miłe (z napisem "Edytuj", więc nie wygląda na to, że narzekasz na nic). – PandaWood

Odpowiedz

14

Jeśli szukasz „nice” sposób podejmowania istniejącego słownika, tworząc nowy słownik z kopii kluczy + wartości, dla podzbioru kluczy, niektóre kod LINQ zrobi to ładnie:

var appSettings = formCollection.AllKeys 
    .Where(k => k.StartsWith("AppSettings.")) 
    .ToDictionary(k => k, k => formCollection[k]); 
+0

Jedynym problemem jest "FormCollection" MVC, który implementuje tylko NameValueCollection - o czym powinienem wspomnieć/zrealizowałem, nie implementuję IEnumerable - zastanawiam się, dlaczego, nawet w MVC3, używałbyś tych niestandardowych klas kolekcji, które nie implementują IEnumerable ... to nie jest temat, ale to wygląda na złą decyzję projektową ...? – PandaWood

+0

W dzisiejszych czasach z genetyką musiałbym się z tym zgodzić. –

+0

Edytowano odpowiedź w celu dopasowania do nowych informacji. –

-6
[HttpPost] 
public ActionResult Index(FormCollection collection) 
{ 
    Dictionary<string,object> form = new Dictionary<string, object>(); 
    collection.CopyTo(form); 
    return View(); 
} 
+1

To jest stare pytanie, które już otrzymało akceptowaną odpowiedź. Ponadto twoja odpowiedź nie wydaje się być poprawna. – Kjartan

+0

Używam un muy conde działa jak urok. Czy mvc na wypadek, gdybyś nie wiedział – smashraid

Powiązane problemy