c# - net - Obtener elemento basado en cadena
net core api route (1)
Estoy creando una api web usando mvc 6. ahora estoy tratando de obtener un elemento de mi db. La clave en esta tabla es una cadena (dirección de correo electrónico). No tengo acceso a esta base de datos, por lo que no puedo cambiar la clave de esta tabla.
Ahora, al crear un demo webapi, pude crear un controlador para extraer elementos basados en una clave que era un int. Pero cuando se intenta obtener un elemento por una cadena, el programa se bloquea.
[Route("api/[controller]")]
public class TodoController : Controller
{
[HttpGet("{id:string}", Name = "GetByIdRoute")]
public IActionResult GetById (string id)
{
var item = _items.FirstOrDefault(x => x.Id == id);
if (item == null)
{
return HttpNotFound();
}
return new ObjectResult(item);
}
}
al intentar acceder a esta ruta (example.com/api/Todo/key) siendo la clave, obtengo una excepción en mi startup.cs
La excepción en el navegador lee:
System.InvalidOperationException La entrada de restricción ''id'' - ''string'' en la ruta ''api / Todo / {id: string}'' no pudo ser resuelta por el sistema de resolución de restricciones del tipo ''DefaultInlineConstraintResolver''.
La parte de startup.cs donde se rompe el código es:
// Add MVC to the request pipeline.
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
Parece que no entiendo por qué no puedo obtener un elemento con una clave que es una cadena. ¿Es esto posible y si es así, qué estoy haciendo mal?
Sólo quita :string
. De todos modos, no está realmente restringiendo el valor de la id
, ya es una cadena en la URL.
Esta publicación de blog bastante antigua enumera las restricciones disponibles, y puede ver que no hay ninguna :string
restricción de :string
, porque no es necesario que exista.
Las restricciones se utilizan para dar prioridad a las restricciones "más específicas", por ejemplo, "si esa parte de la URL es la representación de cadena de DateTime
, use esta ruta", pero como todo es una cadena (en una URL), no hay nada que una restricción de :string
lo haría más específico que, si ves lo que quiero decir.