2012-07-19 11 views
16

Ho appena iniziato a utilizzare VS 2012 RC e sto creando un'applicazione Web ASP.NET MVC 4 in cui prevedo di fornire sia un'interfaccia utente basata su HTML sia un'interfaccia di programmazione basata su WebApi.Posso avere sia un controller che un ApiController per la stessa cosa?

Per il mio sito Web HTML, ho un controller e una vista per ciascuno dei miei modelli (MVC!) E il routing funziona "per convenzione" in modo che, ad esempio, l'URL /client si colleghi al mio ClientController. Il mio ClientController deriva da Controller.

Per la mia API, creerò nuovi controller che derivano da ApiController. Naturalmente desidero che i miei URL API siano simili ai miei URL HTML, quindi mi piacerebbe che le informazioni sul client fossero disponibili al numero /api/client. Tuttavia, con il routing per convenzione, ciò suggerisce che ho bisogno di un ApiController denominato ClientController. E ho già una classe ClientController.

Come mi occupo di questo? Ho bisogno di routing personalizzato? Metto le classi API in diversi namespace in modo che possa dare loro lo stesso nome?

Update: questa domanda sembra suggerire che uno spazio dei nomi diverso per i miei regolatori di API è tutto quello che ho bisogno: Mix web api controllers and site controllers

+0

Hai guardato [aree MVC] (http://msdn.microsoft.com/en-us/library/ee671793.aspx)? – gordonmleigh

+0

@gordonml: Grazie - l'ho appena fatto, e sembra essere sotra, un po 'utile. Tuttavia non posso fare a meno di pensare che sia un po 'esagerato per quello che devo raggiungere. –

+0

IsAjaxRequest funziona per le tue esigenze? http://stackoverflow.com/questions/1681563/detecting-isajaxrequest-with-asp-net-mvc-and-jquery-form-plugin-file-upload – kenny

risposta

12

Tutto ciò che richiede è che le classi controller si trovino in un diverso spazio dei nomi e tutto va bene.

L'utilizzo delle aree MVC potrebbe anche funzionare (come suggerito nel commento di gordonml), ma questo pone in modo efficace i controller in diversi spazi dei nomi, quindi è un modo più formale per ottenere lo stesso risultato.

2

Si può prendere uno sguardo alla following blog post che illustra come un controller Api potrebbe servire vista Razor come bene. Fondamentalmente usa il RazorEngine per analizzare la vista Razor e servirlo.

+1

Err ...grazie, ma sembra l'esatto opposto di quello che sto cercando di ottenere, nel senso che sto cercando di "farlo in modo MVC4" piuttosto che piegarlo per fare qualcosa per cui non è stato progettato. –

+0

Oltre a ciò, i miei due URL faranno cose completamente diverse. Il mio normale URL presenta un'interfaccia utente per fare ogni genere di cose. Il mio URL API fornisce semplicemente l'accesso ai dati. Quindi non è davvero una questione di restituire "lo stesso contenuto" in diversi formati. –

+1

Beh, in questo caso il prefisso '/ api' non dovrebbe infastidirti poiché esegue qualcosa di completamente diverso dal resto dell'applicazione. Ti consente di separare chiaramente la parte API dal sito web. –

1

Per chi cerca guida passo passo su come fare questo su progetto WebAPI:

  1. creare due cartelle/spazi dei nomi, vale a dire: ControllersApi e ControllersWeb
  2. clic destro su ControllersWeb e andare Add -> Controller e selezionare MVC 5 Controller - Empty. Questo aggiungerà tutte le altre dipendenze se non le avessi nel tuo progetto WebApi.
  3. Il tuo RouteConfig registrerà ora quelle classi che ereditano dalla classe base Controller. È probabile che tu debba aggiungere link al controller di default, modificando le impostazioni predefinite per dire: defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }

Questo è tutto, è ora possibile eseguire sito e utilizzare entrambi i controller API e Web.

Problemi correlati