2015-08-24 17 views
5

Sto iniziando solo con MVC 6 avendo precedentemente creato controller separati per chiamate API e chiamate controller standard. In MVC 6 non esiste più una classe APIController e tali azioni possono essere incluse nella classe Controller.Combinazione di chiamate controller controller e chiamate controller nello stesso controller MVC 6

Quindi qui ho un TeamsController. Ho un azione per restituire la vista:

[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) 

Non sono sicuro se ho questi configurato correttamente, come ad esempio quando faccio un post in Javascript GET è chiamato al posto del POST e quando chiamo il Elimina metodo invece viene chiamato GetByTeamId.

Qualcuno può fornire consigli su come impostare al meglio tali percorsi?

EDIT: Qui è il post 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

Puoi mostrarci il post in JavaScript? –

risposta

1

siete quasi arrivati.

Il metodo AddTeam() come nello snippet di codice prevede una richiesta GET, quindi questo spiega probabilmente perché il POST che hai menzionato non ha funzionato. Ma ti piacerebbe avere questo metodo per rispondere a una richiesta POST e non a una richiesta GET poiché altera i dati. Le richieste GET vengono generalmente eseguite con parametri di query URL ed è un po 'pericoloso modificare i dati in questo modo. La firma del metodo dovrebbe essere come:

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

e non dimenticare, se si desidera chiamare il EditTeam() o DeleteTeam() è necessario inviare un PUT o DELETE richiesta rispettivamente

0

si dispone di alcuni errori nei vostri attributi del controller .

[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) 

non è necessario specificare il verbo e il percorso. Sovraccarico dei verbi utilizza la rotta. Non sono sicuro del tuo POST javascript, ma deve andare al metodo [HttpPost] di sicuro se stai facendo una richiesta di post.

Problemi correlati