Necesito implementar el siguiente método WebAPI:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Todos los parámetros de la cadena de consulta pueden ser nulos. 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
dicho:
No se encontró ninguna acción en el controlador 'Libros' que coincida con la solicitud.
¿Cuál es la firma correcta del método para que se comporte como solía, sin tener que especificar el parámetro opcional en el enrutamiento de URL?
c#
url
asp.net-web-api
query-string
frapontillo
fuente
fuente
Get
lo que se enlaza automáticamente con elHTTP GET
método ...string?
No es un tipo válido. No puede declararstring
como un tipo anulable ya que es un tipo de referencia.Respuestas:
Este problema se ha solucionado en la versión regular de MVC4. Ahora puedes hacer:
y todo saldrá de la caja.
fuente
null
se considera una expresión constante y, por lo tanto, un valor predeterminado válido .Es posible pasar múltiples parámetros como un solo modelo, como sugiere 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 un solo 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
Incluso admite múltiples parámetros, siempre que las propiedades no entren en conflicto.
Actualización :
para garantizar que los valores sean opcionales, asegúrese de utilizar tipos de referencia o valores nulos (ej. Int?) Para las propiedades de los modelos.
fuente
int Skip
) y no hay ningún parámetro de consulta para esa propiedad especificada, el método del Controlador API seguirá coincidiendo con éxito con la solicitud y el valor deSkip
solo será el valor predeterminado para ese tipo, o 0 en este casoUtilice los valores predeterminados iniciales para todos los parámetros como a continuación
fuente
DateTime
no es anulable. Ya he intentado usarDateTime?
en su lugar, pero MVC no asigna la solicitud al método dado si configuro solo algunos de los parámetros en mi solicitud HTTP.DateTime
no es un tipo de datos anulable . Su código no debe compilarse, ya que no podría asignar unnull
valor a un parámetro de tipoDateTime
. Tal vez, debería cambiarloDateTime?
o usar un valor diferente para un valor predeterminado comoDateTime.Now
.Datetime.Now
no se puede utilizar en la inicialización de parámetros predeterminada, estoy corregido.Si desea pasar varios parámetros, puede crear un modelo en lugar de pasar varios parámetros.
en caso de que no desee pasar ningún parámetro, también puede omitirlo y su código se verá ordenado y limpio.
fuente
No se pueden proporcionar valores predeterminados para parámetros que no están declarados '
optional
'En tus
WebApiConfig
fuente