Parámetros de cadena de consulta opcionales en ASP.NET API WEB


Necesito implementar el siguiente método WebAPI:

/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX

Todos los parámetros de cadena de consulta pueden ser null. Es decir, la persona que llama puede especificar de 0 a todos los 5 parámetros.

En MVC4 beta Solía hacer lo siguiente:

public class BooksController : ApiController
{
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date) 
    {
        // ...
    }
}

MVC4 RC ya no se comporta así. Si especifico menos de 5 parámetros, responde con un 404 diciendo:

No se encontró ninguna acción en los 'Libros' del controlador que coincida con la solicitud.

¿Qué ¿es la firma de método correcta para que se comporte como antes, sin tener que especificar el parámetro opcional en el enrutamiento de URL?

Author: DavidRR, 2012-08-08

5 answers

Este problema se ha solucionado en la versión regular de MVC4. Ahora puedes hacer:

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

Y todo funcionará fuera de la caja.

 263
Author: frapontillo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-12 11:39:07

Es posible pasar múltiples parámetros como un solo modelo como vijay sugirió. Esto funciona para GET cuando se utiliza el atributo de parámetro FromUri. Esto le indica a WebAPI que rellene el modelo a partir de los parámetros de consulta.

El resultado es una acción de controlador más limpio con un solo parámetro. Para más información ver: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

public class BooksController : ApiController
  {
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks([FromUri]BookQuery query)
    {
      // ...
    }
  }

  public class BookQuery
  {
    public string Author { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public string SomethingElse { get; set; }
    public DateTime? Date { get; set; }
  }

Incluso soporta múltiples parámetros, siempre y cuando las propiedades no entran en conflicto.

// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
  // ...
}

public class Paging
{
  public string Sort { get; set; }
  public int Skip { get; set; }
  public int Take { get; set; }
}

Actualización :
Para asegurarse de que los valores son opcionales, asegúrese de usar tipos de referencia o nullables(ej. int?) para las propiedades de los modelos.

 67
Author: Andrew C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-23 15:08:57

Utilice los valores iniciales por defecto para todos los parámetros como abajo

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}
 54
Author: Muhammad Amin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-05 13:21:48

Si desea pasar varios parámetros, puede crear el modelo en lugar de pasar varios parámetros.

En caso de que no desee pasar ningún parámetro, puede omitir también en él, y su código se verá limpio y ordenado.

 1
Author: vijay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-12 11:51:18

Los valores predeterminados no se pueden proporcionar para los parámetros que no se declaran 'optional'

 Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As String = "DESC", Optional limit As Integer = 99)

En su WebApiConfig

 config.Routes.MapHttpRoute( _
          name:="books", _
          routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _
          defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _
      )
 0
Author: Rizwan Mumtaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-21 10:54:35