2012-07-21 14 views

Respuesta

32

ASP.NET Web API se ha vuelto significativamente más robusto en el tratamiento de diferentes escenarios HTTP, especialmente la transmisión. Como tal, solo los formateadores de tipo de medios normalmente tocan el contenido y tienen que hacer una coherencia del contenido.

En ASP.NET MVC, application/x-www-form-urlencoded tipo de contenido es un ciudadano de primera clase (y se trata sobre todo porque este es el tipo de contenido del 95% de las peticiones POST) y tenemos la FormsCollection para proporcionar acceso diccionario en el acceso, siempre que se define como un parámetro de entrada.

En ASP.NET Web API, application/x-www-form-urlencoded es otro tipo de contenido, y se supone que debe leerlo MediaTypeFormatter. Como tal ASP.NET Web API no puede hacer ninguna suposición sobre el Forms.

El enfoque normal en ASP.NET Web API es representar el formulario como modelo para que el formateador del tipo de medio lo deserialice. Alternativa es definir los parámetros de las acciones como NameValueCollection:

public void Post(NameValueCollection formData) 
{ 
    var value = formData["key"]; 
} 
+1

Supongamos que tenemos algunos valores que eran conocidos, y algunos que son dinámicos. ¿Hay alguna manera de especificar un tipo de modelo para los conocidos? Y obtener el resto en la colección. Algo así como: 'public void Post (modelo PostData, NameValueCollection formData)'? –

+5

El uso de NameValueCollection no funcionó para mí, pero funcionó con FormDataCollection – Pyfhon

+3

NameValueCollection no funcionó para mí también. Usé FormDataCollection como @Pyfhon. – avidProgrammer

17

Bueno, no es posible porque HttpRequestMessage no prevé ese tipo de colección de la caja.

Sin embargo, si su aplicación está alojada bajo ASP.NET, se puede llegar a la corriente HttpContext objetos y obtener los valores del formulario de allí:

public class CarsController : ApiController { 

    public string[] Get() { 

     var httpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"]; 
     var foo = httpContext.Request.Form["Foo"]; 

     return new string[] { 
      "Car 1", 
      "Car 2", 
      "Car 3" 
     }; 
    } 
} 

pero no estoy seguro si esto es la mejor manera de de hacer este tipo de cosas.

+1

No funciona para mí. Devuelve null en 'foo'. –

4

Como alternativa al método de Aliostad, uno puede hacer:

public void Post(HttpRequestMessage request) 
{ 
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync(); 
} 
-1

Prueba esto:

HttpContext.Current.Request.Form["key"]; 
+0

HttpContext no está disponible en las aplicaciones WebApi. – McGuireV10

Cuestiones relacionadas