问题
I've just started to use the VS 2012 RC, and I'm creating an ASP.NET MVC 4 web application in which I plan to provide both an HTML-based user interface and a WebApi-based programming interface.
For my HTML website, I have a controller and view for each of my models (MVC!), and the routing works "by convention" so that, for example, the URL /client
hooks up to my ClientController
. My ClientController
derives from Controller
.
For my API, I will create new controllers that derive from ApiController
. I naturally want my API URLs to be similar to my HTML URLs, so I'd like the client info to be available at /api/client
. However, with the by-convention routing, that would suggest that I need an ApiController named ClientController
. And I already have a ClientController
class.
How do I deal with this? Do I need custom routing? Do I put the API classes in different namespace so that I can give them the same name?
Update: this question seems to suggest that a different namespace for my API controllers is all I need: Mix web api controllers and site controllers
回答1:
All it requires is for the controller classes to be in a different namespace, and all is well.
Using MVC areas would also work (as suggested in gordonml's comment), but this effectively puts the controllers in different namespaces, so it's a more formal way of achieving the same result.
回答2:
You may take a look at the following blog post which illustrates how an Api controller could serve Razor views as well. Basically he uses the RazorEngine to parse the Razor view end serve it.
回答3:
For anyone looking for step by step guidance on how to do this on WebApi project:
- Create two folders / namespaces, namely:
ControllersApi
andControllersWeb
- Right click on
ControllersWeb
and goAdd -> Controller
and selectMVC 5 Controller - Empty
. This will add all other dependencies if you didn't have them in your WebApi project. - Your
RouteConfig
will now register those classes that inherit fromController
base class. You'll likely need to add link to default Controller, by editing defaults to say:defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }
That's it, you can now run site and use both API and Web controllers.
来源:https://stackoverflow.com/questions/11564922/can-i-have-both-a-controller-and-an-apicontroller-for-the-same-thing