parametro parameter opcional c# asp.net-web-api

c# - parameter - Parámetros opcionales en ASP.NET Web API



optional parameter in c# (5)

Necesito implementar el siguiente método WebAPI:

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

Todos los parámetros pueden ser nulos, es decir, el que llama puede especificar desde 0 a 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 dicho 404

No se encontraron acciones en el controlador ''Libros'' que coincida con la solicitud.

¿Cuál es la firma de método correcta para que se comporte como solía hacerlo, sin tener que especificar el parámetro opcional en el enrutamiento de URL?


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

El resultado es una acción de controlador más limpia con solo un parámetro. Para obtener más información, consulte: 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 admite múltiples parámetros, siempre que las propiedades no entren 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 sean opcionales, asegúrese de utilizar tipos de referencia o nulables (por ejemplo, int) para las propiedades de los modelos.


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 saldrá bien de la caja.


Los valores predeterminados no pueden ser suministrados para los parámetros que no son declarados '' 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} _ )


Use los valores predeterminados iniciales para todos los parámetros como a continuación

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


si desea pasar múltiples parámetros, puede crear un modelo en lugar de pasar múltiples parámetros.

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