title: ASP.NET Web API custom post action not working
body: <p>So I have a GebruikerController in my API. Gebruiker is dutch for User, what this controller does is that it logs the user in, gets list of users, adds users and get a specific user. But I have encountered a problem when I introduced my own custom post method for a simple login function. Whenever I send some data from PostMan to the function I get the following response:</p>
  
  <blockquote>
    <p>{"id":["The value 'login' is not valid."]}</p>
  </blockquote>
  
  <p>I access it with this url:</p>
  
  <blockquote>
    <p><a href="http://localhost:52408/api/gebruikers/login" rel="nofollow noreferrer">http://localhost:52408/api/gebruikers/login</a></p>
  </blockquote>
  
  <p>this is my controller:</p>
  
  <pre><code>[Produces("application/json")]
  [Route("api/Gebruikers")]
  public class GebruikersController : Controller
  {
      private readonly flowerpowerContext _context;
  
      public GebruikersController(flowerpowerContext context)
      {
          _context = context;
      }
  
      // GET: api/Gebruikers
      [HttpGet]
      public IEnumerable&lt;Gebruiker&gt; GetGebruiker()
      {
          return _context.Gebruiker;
      }
  
      // GET: api/Gebruikers/5
      [HttpGet("{id}")]
      public async Task&lt;IActionResult&gt; GetGebruiker([FromRoute] int id)
      {
          if (!ModelState.IsValid)
          {
              return BadRequest(ModelState);
          }
  
          var gebruiker = await _context.Gebruiker.SingleOrDefaultAsync(m =&gt; m.Id == id);
  
          if (gebruiker == null)
          {
              return NotFound();
          }
  
          return Ok(gebruiker);
      }
  
      [Route("api/gebruikers/login")]
      [HttpPost]
      public async Task&lt;IActionResult&gt; PostLogin([FromBody] string email, [FromBody] string password)
      {
          if(!ModelState.IsValid)
          {
              return BadRequest(ModelState);
          }
  
          if(GebruikerVerify(email, password))
          {
              var gebruiker = await _context.Gebruiker.FirstOrDefaultAsync((g) =&gt; (g.GebruikerEmail == email &amp;&amp; g.GebruikerWachtwoord == password));
              return Ok(gebruiker);
          }
          else
          {
              return BadRequest("invalid data");
          }
      }
  
      // PUT: api/Gebruikers/5
      [HttpPut("{id}")]
      public async Task&lt;IActionResult&gt; PutGebruiker([FromRoute] int id, [FromBody] Gebruiker gebruiker)
      {
          if (!ModelState.IsValid)
          {
              return BadRequest(ModelState);
          }
  
          if (id != gebruiker.Id)
          {
              return BadRequest();
          }
  
          _context.Entry(gebruiker).State = EntityState.Modified;
  
          try
          {
              await _context.SaveChangesAsync();
          }
          catch (DbUpdateConcurrencyException)
          {
              if (!GebruikerExists(id))
              {
                  return NotFound();
              }
              else
              {
                  throw;
              }
          }
  
          return NoContent();
      }
  
      // POST: api/Gebruikers
      [HttpPost]
      public async Task&lt;IActionResult&gt; PostGebruiker([FromBody] Gebruiker gebruiker)
      {
          if (!ModelState.IsValid)
          {
              return BadRequest(ModelState);
          }
  
          _context.Gebruiker.Add(gebruiker);
          await _context.SaveChangesAsync();
  
          return CreatedAtAction("GetGebruiker", new { id = gebruiker.Id }, gebruiker);
      }
  
      // DELETE: api/Gebruikers/5
      [HttpDelete("{id}")]
      public async Task&lt;IActionResult&gt; DeleteGebruiker([FromRoute] int id)
      {
          if (!ModelState.IsValid)
          {
              return BadRequest(ModelState);
          }
  
          var gebruiker = await _context.Gebruiker.SingleOrDefaultAsync(m =&gt; m.Id == id);
          if (gebruiker == null)
          {
              return NotFound();
          }
  
          _context.Gebruiker.Remove(gebruiker);
          await _context.SaveChangesAsync();
  
          return Ok(gebruiker);
      }
  
      private bool GebruikerExists(int id)
      {
          return _context.Gebruiker.Any(e =&gt; e.Id == id);
      }
  
      private bool GebruikerVerify(string email, string wacthwoord)
      {
          if(_context.Gebruiker.Any(e =&gt; e.GebruikerEmail == email))
          {
              Gebruiker gebruiker = _context.Gebruiker.FirstOrDefault(e =&gt; e.GebruikerEmail == email);
              if(wacthwoord == gebruiker.GebruikerWachtwoord)
              {
                  return true;
              }
              else
              {
                  return false;
              }
          }
          else
          {
              return false;
          }
      }
  }
  </code></pre>
  
  <p>the following code is my login code, which can also be seen in the code above.</p>
  
  <pre><code>        [Route("api/gebruikers/login")]
      [HttpPost]
      public async Task&lt;IActionResult&gt; PostLogin([FromBody] string email, [FromBody] string password)
      {
          if(!ModelState.IsValid)
          {
              return BadRequest(ModelState);
          }
  
          if(GebruikerVerify(email, password))
          {
              var gebruiker = await _context.Gebruiker.FirstOrDefaultAsync((g) =&gt; (g.GebruikerEmail == email &amp;&amp; g.GebruikerWachtwoord == password));
              return Ok(gebruiker);
          }
          else
          {
              return BadRequest("invalid data");
          }
      }
  
      private bool GebruikerVerify(string email, string wacthwoord)
      {
          if(_context.Gebruiker.Any(e =&gt; e.GebruikerEmail == email))
          {
              Gebruiker gebruiker = _context.Gebruiker.FirstOrDefault(e =&gt; e.GebruikerEmail == email);
              if(wacthwoord == gebruiker.GebruikerWachtwoord)
              {
                  return true;
              }
              else
              {
                  return false;
              }
          }
          else
          {
              return false;
          }
      }
  </code></pre>
  
  <p>I'm fairly new to this and I'm clueless about what I'm doing wrong here. Can someone please help me with this?</p>