2015-08-24 14 views
5

Właśnie zaczynam od MVC 6, który wcześniej utworzył osobne kontrolery dla wywołań API i standardowych wywołań kontrolera. W MVC 6 nie ma już więcej klasy APIController i te akcje mogą być zawarte w klasie Controller.Łączenie wywołań kontrolera API i wywołań kontrolera w tym samym kontrolerze MVC 6

Tutaj mam kontrolera TeamsController. Mam działania w celu powrotu na stanowisku:

[Route("Teams")] 
public ActionResult Teams() 

And then I have actions to return data : 

//GET : api/Teams 
[Route("api/Teams")] 
[HttpGet("GetAllTeams")] 
public IEnumerable<Team> GetAllTeams() 

//GET : api/Teams/5 
[Route("api/Teams/{teamId:int}")] 
[HttpGet("{teamId:int}", Name = "GetTeamById")] 
public IActionResult GetTeamById(int teamId) 

//GET : api/Teams/Chicago Bears 
[Route("api/Teams/{teamName}")] 
[HttpGet("{teamName}", Name = "GetTeamByName")] 
public IActionResult GetTeamByName(string teamName) 

//POST : api/Teams 
[Route("api/Teams/{team}")] 
[HttpPost("{team}", Name = "AddTeam")] 
public void AddTeam([FromBody]Team item) 

//PUT: api/Teams 
[Route("api/Teams/{team}")] 
[HttpPut("{team}", Name = "EditTeam")] 
public void EditTeam([FromBody]Team item) 

//DELETE : api/Teams/4 
[Route("api/Teams/{teamId:int}")] 
[HttpDelete("{teamId:int}", Name="DeleteTeam")] 
public IActionResult DeleteTeam(int id) 

nie jestem pewien, czy mam to skonfigurowane poprawnie, jak na przykład, kiedy się post w JavaScript GET nazywa zamiast POST i kiedy nazywam Usuń metodę zamiast wywołania GetByTeamId.

Czy ktoś może doradzić, jak najlepiej ustawić te trasy?

EDIT: Oto po Javascript:

var tAdd = new team(self.Id(), self.TeamName(), self.Logo()); 

        var dataObjectAdd = ko.toJSON(tAdd); 

        $.ajax({ 
         url: 'http://lovelyjubblymvc6.azurewebsites.net/api/Teams', 
         type: 'post', 
         data: dataObjectAdd, 
         contentType: 'application/json', 
         success: function (data) { 
          self.teams.push(new team(data.TeamId, data.TeamName, data.Logo)); 
          self.TeamName(''); 
          self.Logo(''); 
         }, 
         error: function (err) { 
          console.log(err); 
         } 
        }); 
+0

Czy możesz pokazać nam post w JavaScript? –

Odpowiedz

1

Jesteś prawie tam.

Metoda jak w twoim fragmencie kodu oczekuje żądania GET, więc to wyjaśnia, dlaczego wspomniany POST nie zadziałał. Ale chciałbyś, aby ta metoda odpowiadała na żądanie POST, a nie na żądanie GET, ponieważ zmienia dane. Żądania GET są zwykle wykonywane z parametrami zapytań URL i jest to trochę niebezpieczne, aby zmienić dane w ten sposób. Podpis metoda powinna być jak:

[Route("api/Teams/{team}")] 
[HttpGet("{team}", Name = "AddTeam")] 
public void AddTeam([FromBody]Team item) 

I nie zapomnij, jeśli chcesz wywołać EditTeam() lub DeleteTeam() trzeba wysłać żądanie usunięcia PUT lub odpowiednio

0

masz jakieś błędy w swoich atrybutach kontrolerów .

[Route("Teams")] 
public ActionResult Teams() 

And then I have actions to return data : 

//GET : api/Teams 
[HttpGet("api/Teams")] 
public IEnumerable<Team> GetAllTeams() 

//GET : api/Teams/5 
[HttpGet("api/Teams/{teamId:int}")] 
public IActionResult GetTeamById(int teamId) 

//GET : api/Teams/Chicago Bears 
[HttpGet("api/Teams/{teamName}")] 
public IActionResult GetTeamByName(string teamName) 

//POST : api/Teams 
[HttpPost("api/Teams/{team}")] 
public void AddTeam([FromBody]Team item) 

//PUT: api/Teams 
[HttpPut("api/Teams/{team}")] 
public void EditTeam([FromBody]Team item) 

//DELETE : api/Teams/4 
[HttpDelete("api/Teams/{teamId:int}")] 
public IActionResult DeleteTeam(int id) 

Nie trzeba określać czasownika i trasy. Przeciążenie czasownika używa trasy. Nie jestem pewien co do twojego javascript POST, ale musi on przejść do metody [HttpPost] na pewno, jeśli robisz post.

Powiązane problemy