2012-04-19 17 views
5

Tengo curiosidad por saber por qué el ApiController maneja los valores de parámetros predeterminados en las acciones de forma diferente a un controlador "regular".Valor de parámetro predeterminado en MVC 4 Web API

Este código funciona bien, petición a/medios de prueba página obtiene el valor 1

public class TestController : Controller 
{ 
    public ActionResult Index(int page = 1) 
    { 
     return View(page); 
    } 
} 

Este código no funciona cuando se hace una petición a/API/valores. Falla con:

"El diccionario de parámetros contiene una entrada nula para el parámetro 'página' de tipo no nulo 'System.Int32' para el método 'System.Collections.Generic.IEnumerable`1 [System.String] Get (Int32) 'en' MvcApplication1.Controllers.Controllers.ValuesController '. Un parámetro opcional debe ser un tipo de referencia, un tipo anulable o ser declarado como un parámetro opcional. "

public class ValuesController : ApiController 
{ 
    public IEnumerable<string> Get(int page = 1) 
    { 
     return new string[] { page.ToString() }; 
    }  
} 

¿Alguna pista sobre qué es esto?

Respuesta

5

Trate de añadir la [FromUri] o [FromForm] atributo parámetro.

public class ValuesController : ApiController 
{ 
    public IEnumerable<string> Get([FromUri]int page = 1) 
    { 
     return new string[] { page.ToString() }; 
    }  
} 

Mike Stall tiene dos buenos mensajes acerca de atar en WebAPI que no funciona como lo hace en ASP MVC parámetro. El gran problema para acostumbrarse es que solo puede leer el cuerpo de la solicitud una vez en su canalización. Por lo tanto, si necesita leer más de 1 objeto complejo como parámetro, probablemente necesite recurrir a ModelBinding por parámetro. Tuve un problema similar al suyo cuando estaba leyendo el cuerpo de contenido antes en la tubería para fines de registro y no me di cuenta de la restricción de lectura una vez anterior y tuve que resolver con mi propia carpeta de modelo personalizado.

Explica vinculante en http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx modelo y luego sugiere una manera de hacer WebAPI modelo de unión más como ASP MVC http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx

+0

Gracias, leerán estas publicaciones del blog, con suerte eso aclarará las cosas. –

+0

Parece que es [FromUri] hoy en día! – Olaj

0

Trate definir como Nullable<T>:

public class ValuesController : ApiController 
{ 
    public IEnumerable<string> Get(int? page = 1) 
    { 
     return new string[] { page.ToString() }; 
    }  
} 
+0

yo no resolverlo de una manera similar. No estaba buscando una solución aquí, quería saber por qué el comportamiento era diferente entre los dos tipos de controladores. Gracias por la respuesta sin embargo. –

Cuestiones relacionadas