Search code examples
c#asp.net-web-api2asp.net-web-api-routingattributeroutingasp.net-web-api-filters

Attribute Routing with Parameters in Asp.Net Web API 2


In Asp.Net Web API 2 Attribute routing, If i call any attribute i need to get all list of data mapping with that attribute but I am getting the first element of a sequence that satisfies a condition.
My controller looks like this:

[RoutePrefix("api/Ifcobjects")]
public class IfcobjectsController : ApiController
{
    static List<Ifcobject> Ifcobjects = new List<Ifcobject>()
    {
        new Ifcobject() { Id = 1,Ifctype="Ifcwall", Name = "Stdwall",Tag="Wall",Material="Beton",Breite=25,Betonklasse="C30/37" },
        new Ifcobject() { Id = 2,Ifctype="Ifcwall", Name = "Stdwall",Tag="Wall",Material="Beton",Breite=50 },
        new Ifcobject() { Id = 3,Ifctype="Ifcwall", Name = "Stdwall50cm",Tag="Wall",Material="Beton",Breite=75 },
        new Ifcobject() { Id = 4,Ifctype="Ifcbeam", Name = "beam",Tag="Beam",Material="Beton",Breite=100 }

    };
    public IHttpActionResult Get()
    {
        return Ok(Ifcobjects);
    }

    public IHttpActionResult Get(int id)
    {
        var Ifcobject = Ifcobjects.FirstOrDefault(s => s.Id == id);
        if (Ifcobject == null)
        {
            //return NotFound();
            return Content(HttpStatusCode.NotFound, "Ifcobject not found");
        }

        return Ok(Ifcobject);
    }

    [Route("{Ifctype:alpha}")]
    public Ifcobject Get(string ifctype)
    {
        return Ifcobjects.FirstOrDefault(s => s.Ifctype.ToLower() == ifctype.ToLower());

    }
}

Solution

  • Other actions will need route templates as well and in some cases parameter constraints

    Update routes.

    //GET api/Ifcobjects
    [HttpGet]
    [Route("")]
    public IHttpActionResult Get() {
        return Ok(Ifcobjects);
    }
    
    //GET api/Ifcobjects/1
    [HttpGet]
    [Route("{id:int}")]
    public IHttpActionResult Get(int id) {
        var Ifcobject = Ifcobjects.FirstOrDefault(s => s.Id == id);
        if (Ifcobject == null) {
            //return NotFound();
            return Content(HttpStatusCode.NotFound, "Ifcobject not found");
        }
        return Ok(Ifcobject);
    }
    
    //GET api/Ifcobjects/Ifcwall
    [HttpGet]
    [Route("{Ifctype:alpha}")]
    public IHttpActionResult Get(string ifctype) {
        var results = Ifcobjects.Where(s => s.Ifctype.ToLower() == ifctype.ToLower()).ToList();
        if(results.Count == 0) {
            return Content(HttpStatusCode.NotFound, "ifctype not found");
        }
        return Ok(results);
    }
    

    Reference Attribute Routing in ASP.NET Web API 2