2011-02-03 26 views
7

¿Hay alguna forma de dividir un en un FormCollection que contenga solo aquellas teclas que comienzan con una cierta cadena?Cortando un FormCollection por teclas que comienzan con una cierta cadena

(Esta pregunta es básicamente el mismo que this-> pero para C#/FormCollection en lugar de pitón Slicing a dictionary by keys that start with a certain string)

Esto es lo que me ocurrió a evitar el problema:

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

Editar: El problema con este código, es que tengo que hacerlo varias veces para diferentes cadenas de StartsWith, y por lo tanto necesitaré crear un método de 'utilidad' para hacer lo anterior. Sería bueno si se podía leer en una línea como:

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

de fondo (no es necesario para resolver el problema): El contexto es asp.net mvc, y de una forma con un diccionario dinámico campos.

También es similar a esta pregunta - Return FormCollection items with Prefix - pero no es lo mismo.

Y habiendo leído esta respuesta How to build C# object from a FormCollection with complex keys - Empecé a preguntarme si sería mejor que no utilizara formularios, sino que enviara JSON.

+0

¿Qué problema tiene el código que tiene? –

+0

Tenga en cuenta que siempre debe describir el * problema *. Aquí parece que dices "estoy haciendo algo, y así es como lo estoy haciendo. ¿Hay alguna manera de hacerlo?", Pero sin decirnos por qué tu solución actual * no es agradable *. –

+0

Gracias, he editado la pregunta para decir por qué no es agradable (con la palabra "Editar" para que no parezca que no te quejas de nada) – PandaWood

Respuesta

14

Si usted está buscando una manera "agradable" de tomar un diccionario existente, produciendo un nuevo diccionario con copias de las claves + valores, para un subconjunto de las claves, algo de código LINQ hará esto muy bien:

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

El único problema es el MVC 'FormCollection', que solo implementa NameValueCollection - que debería haber mencionado/realizado no implementa IEnumerable - Me pregunto por qué, incluso en MVC3, usaría estas clases de colección personalizadas que no implementan IEnumerable ... está fuera de tema, pero parece una mala decisión de diseño ...? – PandaWood

+0

En este día y edad con genética, tendría que estar de acuerdo. –

+0

Respuesta editada para adaptarse a la nueva información. –

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

Esta es una pregunta anterior, que ya recibió una respuesta aceptada. Además, su respuesta no parece ser correcta. – Kjartan

+0

Uso un conde muy funciona como un amuleto. Es mvc en caso de que no lo sepas – smashraid

Cuestiones relacionadas