es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

API de .NET Core: se pierde el prefijo oData al pasar argumentos.

Esta llamada funciona correctamente y está mapeada a /oData/Projects.

[HttpGet(Name = "GetProjects")]
[EnableQuery]
public IEnumerable<projectentity> Get()
{
    return _db.Projects;
}

¿Cómo puedo pasar un argumento sin perder el prefijo oData en la URL?

Esto pierde el prefijo oData:

[HttpGet("{id}", Name = "GetProjectById")]
[EnableQuery]
public ProjectEntity GetProjectById(int id)
{
    return _db.Projects.Where(p => p.Id == id).FirstOrDefault();
}

Estoy utilizando .net core web api y oData 8.0

Aquí está el controlador completo:

“`csharp
[ApiController]
[Route("[controller]")]
public class ProjectsController : ControllerBase
{<br />
private readonly ILogger<projectscontroller> _logger;
private readonly ApplicationDbContext _db;

<pre><code>public ProjectsController(ILogger<projectscontroller> logger, ApplicationDbContext db)
{
_logger = logger;
_db = db;
}

[HttpGet("{id}", Name = "GetProjectById")]
[EnableQuery]
public ProjectEntity GetProjectById(int id)
{
return _db.Projects.Where(p => p.Id == id).FirstOrDefault();
}

[HttpGet(Name = "GetProjects")]
[EnableQuery]
public IEnumerable<projectentity> Get()
{
return _db.Projects;
}
</code></pre>

}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para pasar un argumento sin perder el prefijo oData en la URL, puedes usar el siguiente código:

    [HttpGet("{id}", Name = "GetProjectById")]
    [EnableQuery]
    public ProjectEntity GetProjectById([FromODataUri] int id)
    {
        return _db.Projects.Where(p => p.Id == id).FirstOrDefault();
    }
    

    Al agregar el atributo [FromODataUri] antes del parámetro int id, le indicas a la acción GetProjectById que espere que el valor de id se recupere de la URI de oData. Esto permitirá que la URL use el prefijo oData y aún así pase el argumento.

Comments are closed.