parámetro parameter opcional name method make define c# asp.net asp.net-web-api asp.net-web-api-routing

parameter - c# parámetro opcional



Parámetros opcionales en el enrutamiento de atributos de Api web (3)

Convertir mi comentario en una respuesta para complementar la respuesta de @Kiran Chala, ya que parece útil para el público-

Cuando marcamos un parámetro como opcional en la acción uri usando ? carácter, entonces debemos proporcionar valores por defecto a los parámetros en la firma del método como se muestra a continuación:

MyMethod(string name = "someDefaultValue", int? Id = null)

Quiero manejar POST de la siguiente API-Call:

/v1/location/deviceid/appid

Los parámetros adicionales provienen del cuerpo posterior.

Todo esto funciona bien para mí. Ahora deseo extender mi código al permitir que "deviceid" y / o "appid" y / o BodyData sean nulos:

/v1/location/deviceid /v1/location/appid /v1/location/

Estas 3 URL deben responder por la misma ruta.

Mi primer acercamiento (se requiere BodyData):

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")] public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData) { return repository.AddNewLocation(deviceid, appid, BodyData); }

Esto no funciona y devuelve un error de compilación:

"Los parámetros opcionales deben estar al final"

Siguiente intento:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")] public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)

Ahora mi función AddNewLocation () obtiene siempre un BodyData=null , incluso si la llamada envía el cuerpo.

Finalmente configuré los 3 Parámetros opcionales:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")] public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)

No trabajes:

El parámetro opcional BodyData no es compatible con FormatterParameterBinding .

¿Por qué quiero una solución con parámetros opcionales? Mi controlador maneja solo la "adición de una nueva ubicación" a través de un POST.

Quiero enviar datos erróneos mis propias excepciones o mensajes de error. Incluso si la llamada tiene valores perdidos. En este caso, quiero poder decidir lanzar una excepción o Configuración de valores predeterminados por mi código.


Otra información: si desea utilizar una Restricción de ruta , imagine que desea forzar que ese parámetro tenga el tipo de datos int , entonces necesita usar esta sintaxis:

[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]

El ? el personaje se pone siempre antes del último } caracter

Para obtener más información, consulte: Parámetros URI opcionales y valores predeterminados


Para una solicitud entrante como /v1/location/1234 , como se puede imaginar, sería difícil para la API web determinar automáticamente si el valor del segmento correspondiente a ''1234'' está relacionado con la appid y no con el deviceid .

Creo que deberías cambiar tu plantilla de ruta para que sea como [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")] y luego analizar deiveOrAppid para descubrir el tipo de id.

También debe hacer que los segmentos en la plantilla de ruta sean opcionales, de lo contrario los segmentos se consideran necesarios. Tenga en cuenta el ? personaje en este caso. Por ejemplo: [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]