Estoy creando una API web usando mvc 6. Ahora estoy tratando de obtener un elemento de mi base de datos. la clave en esta tabla es una cadena (dirección de correo electrónico). No tengo acceso a esta base de datos, así que no puedo cambiar la clave de esta tabla.
Ahora, al crear una demostración webapi, pude crear un controlador para extraer elementos en función de una clave que era un int. Pero al tratar de obtener un elemento mediante una cadena, el programa falla.
[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); } }cuando intento acceder a esta ruta (example.com/api/Todo/key) siendo la clave la cadena, obtengo una excepción en mi startup.cs
la excepción en el navegador dice:
System.InvalidOperationException La entrada de restricción 'id' - 'string' en la ruta 'api/Todo/{id:string}' no pudo ser resuelta por el solucionador de restricciones de 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 puedo entender por qué no puedo obtener un elemento mediante una clave que es una cadena. ¿Es esto posible y, de ser así, qué estoy haciendo mal?
Simplemente elimine :string . Realmente no está restringiendo el valor de la id de todos modos, ya es una cadena en la URL.
Esta publicación de blog bastante antigua enumera las restricciones disponibles, y puede ver que no hay una restricción de :string , porque no es necesario que la haya.
Las restricciones se utilizan para dar prioridad a restricciones "más específicas", por ejemplo, "Si esa parte de la URL es la representación de cadena de un 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 entiendes lo que quiero decir.