2012-07-19 7 views
16

Ich habe gerade angefangen, die VS 2012 RC zu verwenden, und ich erstelle eine ASP.NET MVC 4-Webanwendung, in der ich sowohl eine HTML-basierte Benutzeroberfläche als auch eine WebApi-basierte Programmierschnittstelle bereitstellen möchte.Kann ich sowohl einen Controller als auch einen ApiController für die gleiche Sache haben?

Für meine HTML-Website habe ich einen Controller und Ansicht für jedes meiner Modelle (MVC!), Und das Routing funktioniert "per Konvention", so dass zum Beispiel die URL /client an meine ClientController hakt. Meine ClientController stammt von Controller.

Für meine API werde ich neue Controller erstellen, die von ApiController ableiten. Ich möchte natürlich, dass meine API-URLs meinen HTML-URLs ähneln. Daher möchte ich, dass die Client-Informationen unter /api/client verfügbar sind. Mit dem herkömmlichen Routing würde dies jedoch bedeuten, dass ich einen ApiController mit dem Namen ClientController benötige. Und ich habe bereits eine ClientController Klasse.

Wie gehe ich damit um? Benötige ich ein individuelles Routing? Platziere ich die API-Klassen in verschiedenen Namespaces, damit ich ihnen denselben Namen geben kann?

Update: diese Frage, dass ein anderer Namespace alle für meine API-Controller scheint darauf hinzudeuten, die ich brauche: Mix web api controllers and site controllers

+0

Haben Sie sich [MVC Bereiche] (http://msdn.microsoft.com/en-us/library/ee671793.aspx) angesehen? – gordonmleigh

+0

@gordonml: Danke - ich tat es einfach, und es scheint sotra, irgendwie nützlich. Aber ich kann mir nicht helfen zu fühlen, dass es etwas übertrieben ist für das, was ich erreichen muss. –

+0

Funktioniert IsAjaxRequest für Ihre Bedürfnisse? http://stackoverflow.com/questions/1681563/detecting-isajaxrequest-with-asp-net-mvc-and-jquery-form-plugin-file-upload – kenny

Antwort

12

Alles, was es benötigt, ist, dass die Controller-Klassen in einem anderen Namensraum stehen, und alles ist gut.

Die Verwendung von MVC-Bereichen würde ebenfalls funktionieren (wie in gordonmls Kommentar vorgeschlagen), aber dies versetzt die Controller effektiv in verschiedene Namespaces, so dass es ein formellerer Weg ist, das gleiche Ergebnis zu erzielen.

2

Sie am following blog post einen Blick darauf werfen können, die zeigt, wie ein Api Controller Razor dienen könnte Ansichten als Gut. Im Grunde verwendet er die RazorEngine, um die Razor-Ansicht zu analysieren und zu beenden.

+1

Err ...Danke, aber das sieht wie das genaue Gegenteil von dem aus, was ich erreichen will, in dem ich versuche, es "auf die Art von MVC4 zu tun", anstatt es zu etwas zu machen, für das es nicht entworfen wurde. –

+0

Außerdem werden meine zwei URLs ganz andere Dinge tun. Meine normale URL präsentiert eine Benutzeroberfläche, um alle möglichen Dinge zu tun. Meine API-URL bietet lediglich Zugriff auf die Daten. Es geht also nicht darum, "denselben Inhalt" in verschiedenen Formaten zurückzugeben. –

+1

Nun, in diesem Fall sollte das Präfix '/ api' Sie nicht stören, da es etwas völlig anderes als der Rest der Anwendung ausführt. Es ermöglicht Ihnen, den API-Teil von der Website klar zu trennen. –

1

Für alle, die Schritt für Schritt Anleitung suchen, wie dies auf WebAPI Projekt zu tun:

  1. Erstellen Sie zwei Ordner/Namespaces, nämlich: ControllersApi und ControllersWeb
  2. Rechtsklick auf ControllersWeb und gehen Add -> Controller und wählen Sie MVC 5 Controller - Empty. Dadurch werden alle anderen Abhängigkeiten hinzugefügt, wenn Sie sie nicht in Ihrem WebApi-Projekt hatten.
  3. Ihr RouteConfig registriert jetzt die Klassen, die von Controller Basisklasse erben. Sie müssen wahrscheinlich Link hinzufügen Controller standardmäßig durch Standardwerte Bearbeitung zu sagen: defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }

Das ist es, Sie jetzt Ort laufen und beide API und Web-Controller verwenden.

Verwandte Themen