In ASP.NET 5 MVC 6 Microsoft ha unito la classe del controller MVC normale (Controller
) con la classe del controller Web Api (ApiController
). Ora c'è solo una classe Controller
da cui ereditare, che include anche le funzionalità di WebApi.Qual è la differenza tra MVC Controller e Web API Controller in ASP.NET MVC 6?
Così ora non è così semplice distinguere i controller MVC e WebApi. Entrambi ereditano dalla classe Controller
. L'unica differenza che posso individuare è che le informazioni di routing di WebApi sono ancora fornite dagli attributi HttpGet
, HttpPost
, HttpPut
e HttpDelete
. Ma ora è possibile fare lo stesso con i controller MVC utilizzando il routing degli attributi, solo con attributi diversi.
Anche le funzionalità sembrano essersi unite. I controller MVC supportano ora anche la negoziazione del contenuto.
Le domande concrete sono:
C'è ancora una differenza reale, o è solo il modo in cui vengono specificati i percorsi? Qual è il modo preferito per creare app web?
(quasi) vuoto di controllo MVC:
public class HomeController : Controller
{
public List<Person> Index()
{
return new List<Person>()
{
new Person() {Firstname = "test1", Lastname = "test2"},
new Person() {Firstname = "test3", Lastname = "test4"}
};
}
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
return View();
}
public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";
return View();
}
public IActionResult Error()
{
return View("~/Views/Shared/Error.cshtml");
}
}
(quasi) del controller WebAPI vuoto:
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET: api/values
[HttpGet]
public IEnumerable<Person> Get()
{
return new List<Person>()
{
new Person() {Firstname = "test1", Lastname = "test2"},
new Person() {Firstname = "test3", Lastname = "test4"}
};
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
EDIT:
Se volete provare se la negoziazione dei contenuti funziona, devi includere questo codice nel tuo metodo Startup.ConfigureServices, perché per impostazione predefinita il tipo restituito è solo JSON.
services.Configure<MvcOptions>(options =>
{
options.AddXmlDataContractSerializerFormatter();
});
@Will In MVC 6 non esiste una classe 'ApiController', sono stati uniti nella classe' Controller'. Questo è esattamente ciò che ottieni se crei un controller WebApi con Visual Studio – Domysee
Bene, suppongo di dover esaminare MVC6:/ – Will
Sì, molte modifiche interessanti si sono verificate lì – Domysee