MVC 6 Multiple Get Methods

John Edwards picture John Edwards · Jan 18, 2016 · Viewed 15k times · Source

I am trying to support multiple Get() methods per controller, as well as just specially named methods accessible through web api. I have done this in MVC 5, but can't seem to figure out how it is done in MVC 6. Any ideas? Thanks.

Answer

Shyju picture Shyju · Jan 18, 2016

You cannot have multiple Get methods with same url pattern. You can use attribute routing and setup multiple GET method's for different url patterns.

[Route("api/[controller]")]
public class IssuesController : Controller
{
    // GET: api/Issues
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "item 1", "item 2" };
    }

    // GET api/Issues/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "request for "+ id;
    }

    // GET api/Issues/special/5
    [HttpGet("special/{id}")]
    public string GetSpecial(int id)
    {
        return "special request for "+id;
    }
    // GET another/5
    [HttpGet("~/another/{id}")]
    public string AnotherOne(int id)
    {
        return "request for AnotherOne method with id:" + id;
    }
    // GET api/special2/5
    [HttpGet()]
    [Route("~/api/special2/{id}")]
    public string GetSpecial2(int id)
    {
        return "request for GetSpecial2 method with id:" + id;
    }
}

You can see that i used both HttpGet and Route attributes for defining the route patterns.

With the above configuration, you you will get the below responses

Request Url : yourSite/api/issues/

Result ["value1","value2"]

Request Url : yourSite/api/issues/4

Result request for 4

Request Url : yourSite/api/special2/6

Result request for GetSpecial2 method with id:6

Request Url : yourSite/another/3

Result request for AnotherOne method with id:3