2012-07-19 14 views
16

Właśnie zacząłem używać VS 2012 RC i tworzę aplikację internetową ASP.NET MVC 4, w której planuję dostarczyć zarówno interfejs użytkownika oparty na HTML, jak i interfejs programowania oparty na WebApi.Czy mogę mieć zarówno kontroler, jak i kontroler ApiController dla tego samego?

Dla mojej witryny HTML, mam kontroler i widok dla każdego z moich modeli (MVC!), A routing działa "zgodnie z konwencją", dzięki czemu na przykład adres URL /client jest zgodny z moim ClientController. Moje ClientController pochodzi z Controller.

Dla mojego API utworzę nowe kontrolery, które pochodzą z ApiController. Naturalnie chcę, aby moje adresy URL API były podobne do adresów URL HTML, więc chciałbym, aby informacje o kliencie były dostępne pod adresem /api/client. Jednak dzięki konwencjonalnemu routingowi sugerowałbym, że potrzebuję ApiController o nazwie ClientController. I mam już klasę ClientController.

Jak sobie z tym poradzić? Czy potrzebuję niestandardowego routingu? Czy umieszczam klasy API w różnych przestrzeniach nazw, aby móc nadać im taką samą nazwę?

Aktualizacja: kwestia ta wydaje się sugerować, że inny nazw dla moich kontrolerów API jest wszystko czego potrzebuję: Mix web api controllers and site controllers

+0

Czy obejrzałeś [obszary MVC] (http://msdn.microsoft.com/en-us/library/ee671793.aspx)? – gordonmleigh

+0

@gordonml: Dzięki - po prostu to zrobiłem i wydaje mi się, że to sotra, przydaje się. Jednak nie mogę oprzeć się wrażeniu, że jest trochę przesadzone z tego, co muszę osiągnąć. –

+0

Czy program IsAjaxRequest działa zgodnie z Twoimi potrzebami? http://stackoverflow.com/questions/1681563/detecting-isajaxrequest-with-asp-net-mvc-and-jquery-form-plugin-file-upload – kenny

Odpowiedz

12

Wystarczy, że klasy kontrolerów będą znajdować się w innym obszarze nazw i wszystko będzie dobrze.

Używanie obszarów MVC również działałoby (jak sugerowano w komentarzu gordonml), ale to skutecznie umieszcza kontrolery w różnych przestrzeniach nazw, więc jest to bardziej formalny sposób osiągnięcia tego samego wyniku.

2

Można spojrzeć na following blog post który ilustruje, w jaki sposób kontroler Api może służyć widoki ostrzami dobrze. Zasadniczo używa on RazorEngine do parsowania końcówki widoku Razor.

+1

Błąd ...dziękuję, ale to wygląda jak biegun przeciwieństwa tego, co próbuję osiągnąć, w tym, że próbuję "zrobić to na MVC4", zamiast nakłonić go do zrobienia czegoś, do czego nie był przeznaczony. –

+0

Poza tym moje dwa adresy URL będą robić zupełnie różne rzeczy. Mój normalny URL przedstawia interfejs użytkownika do robienia wszelkiego rodzaju rzeczy. Mój adres URL interfejsu API zapewnia dostęp do danych. Tak naprawdę nie jest to kwestia zwrócenia "tej samej treści" w różnych formatach. –

+1

Cóż, w tym przypadku prefiks '/ api' nie powinien przeszkadzać, ponieważ wykonuje coś zupełnie innego niż reszta aplikacji. Pozwala wyraźnie oddzielić część API od strony internetowej. –

1

Dla każdego, kto szuka kroku wskazówek kroku, jak to zrobić w projekcie WebAPI:

  1. Utwórz dwa foldery/nazw, a mianowicie: ControllersApi i ControllersWeb
  2. prawym przyciskiem myszy na ControllersWeb i iść Add -> Controller i wybierz MVC 5 Controller - Empty. Spowoduje to dodanie wszystkich innych zależności, jeśli nie masz ich w projekcie WebApi.
  3. Twoje RouteConfig zarejestruje teraz te klasy, które dziedziczą po klasie bazowej Controller. Będziesz prawdopodobnie trzeba dodać odnośnik do domyślnego kontrolera, edytując domyślne powiedzieć: defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }

To wszystko można teraz uruchomić stronę i korzystać z obu API i sieci kontrolerów.

Powiązane problemy