2008-11-27 17 views

Respuesta

12

Esto es exactamente la misma que la modificación Request.Querystring. Ambas son intrínsecamente complicadas por propiedades privadas y lo que podría considerarse un error, sin embargo, hay dos posibles soluciones de las que soy consciente (descartaré el plan de respuesta directo. Es terrible).

método es utilizar la reflexión para modificar la colección directamente:

NameValueCollection oQuery = Request.QueryString; 
oQuery = (NameValueCollection)Request.GetType().GetField("_queryString",BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Request); 
PropertyInfo oReadable = oQuery .GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
oReadable.SetValue(oQuery, false, null); 
oQuery["foo"] = "bar"; 
oReadable.SetValue(oQuery, true, null); 

Plan B, que creo que se presta mejor a la unidad de pruebas es evitar tratar con la recogida directa y en lugar de pasarla como NameValueCollection a cualquier método que desee manejar, copiando poco a poco lo que necesite de él. Lo he usado para burlar solicitudes web.

Editar: Marc Gravell dio razones más elocuentes para el plan B

+1

Manipulación de cosas privadas de esta manera es de ninguna manera una cosa sugerida y se debe evitar tanto como sea posible (~ = a toda costa). Después de todo, se hacen privados por una razón. Confiarás en una versión específica de una biblioteca. Cualquier cambio en la implementación subyacente podría romper su aplicación. –

+0

Y verá que defiendo el plan B – annakata

+0

Plan A se perdió algo de detalle. Creo que no es el camino correcto. Puedes probar por ti mismo. –

2

El formulario es una representación de lo que el cliente envió en la solicitud. ¿Qué es lo que quieres hacer? Personalmente, trataría de separar el código "leer el formulario" del código "hacer algo con los valores", de esa manera, puede hacer cualquier preprocesamiento desde el principio (al leer desde el formulario), y ninguno de los posteriores el código necesita saber acerca de lo que fue realmente enviado - simplemente toma los valores que se le dieron (es decir, nunca habla directamente con la solicitud).

Si también significa que puede probar su lógica sin la necesidad de un formulario, o incluso una solicitud http en absoluto.

En realidad, ASP.NET MVC va a hacer mucho de esto (el párrafo anterior) para usted ...

Tenga en cuenta que puede actualizar la colección .Items - pero esto es un poco más vago (es decir, no se relaciona específicamente con la forma).

(aplausos para la fijación de la typo cierto)

Cuestiones relacionadas