2012-07-19 5 views
16

Acabo de comenzar a utilizar VS 2012 RC, y estoy creando una aplicación web ASP.NET MVC 4 en la que tengo previsto proporcionar una interfaz de usuario basada en HTML y una interfaz de programación basada en WebApi.¿Puedo tener un controlador y un ApiController para la misma cosa?

Por mi página web HTML, tengo un controlador y vista para cada uno de mis modelos (MVC!), Y el funcionamiento del enrutamiento "por convención" de manera que, por ejemplo, las URL /client ganchos a mi ClientController. Mi ClientController deriva de Controller.

Para mi API, crearé nuevos controladores que se derivan de ApiController. Naturalmente, quiero que mis URL de API sean similares a mis URL HTML, por lo que me gustaría que la información del cliente esté disponible en el /api/client. Sin embargo, con el enrutamiento por convención, eso sugeriría que necesito un ApiController llamado ClientController. Y ya tengo una clase ClientController.

¿Cómo manejo esto? ¿Necesito un enrutamiento personalizado? ¿Puse las clases de API en diferentes espacios de nombres para poder darles el mismo nombre?

Actualización: esta pregunta parece sugerir que un espacio de nombres diferente para mis controladores de API es todo lo que necesita: Mix web api controllers and site controllers

+0

¿Ha mirado en [áreas de MVC] (http://msdn.microsoft.com/en-us/library/ee671793.aspx)? – gordonmleigh

+0

@gordonml: Gracias - Acabo de hacerlo, y parece ser sotra, algo útil. Sin embargo, no puedo evitar sentir que es un poco exagerado para lo que necesito lograr. –

+0

¿IsAjaxRequest funciona para sus necesidades? http://stackoverflow.com/questions/1681563/detecting-isajaxrequest-with-asp-net-mvc-and-jquery-form-plugin-file-upload – kenny

Respuesta

12

Todo lo que se requiere es que las clases de controlador estén en un espacio de nombre diferente, y todo está bien.

El uso de áreas MVC también funcionaría (como se sugiere en el comentario de gordonml), pero esto efectivamente coloca los controladores en diferentes espacios de nombres, por lo que es una forma más formal de lograr el mismo resultado.

2

Usted puede echar un vistazo a la following blog post que ilustra cómo un controlador Api podría servir vistas Razor como bien. Básicamente, usa el RazorEngine para analizar el extremo de la vista de Razor.

+1

Err ...gracias, pero eso se ve como el polo opuesto de lo que trato de lograr, en el sentido de que estoy tratando de "hacerlo de la manera MVC4" en lugar de doblarlo para hacer algo para lo que no fue diseñado. –

+0

Además de eso, mis dos URL harán cosas completamente diferentes. Mi URL normal presenta una interfaz de usuario para hacer todo tipo de cosas. Mi API URL simplemente proporciona acceso a los datos. Por lo tanto, no se trata de devolver "el mismo contenido" en diferentes formatos. –

+1

Bueno, en este caso, el prefijo '/ api' no debería molestarlo ya que realiza algo completamente diferente al resto de la aplicación. Le permite separar claramente la parte API del sitio web. –

1

Para aquellos que buscan orientación paso a paso sobre cómo hacer esto en el proyecto WebAPI:

  1. Cree dos carpetas/espacios de nombres, a saber: ControllersApi y ControllersWeb
  2. Haga clic derecho sobre ControllersWeb e ir Add -> Controller y seleccione MVC 5 Controller - Empty. Esto agregará todas las demás dependencias si no las tiene en su proyecto WebApi.
  3. Su RouteConfig ahora registrará las clases que heredan de la clase base Controller. Es probable que necesite añadir enlace por defecto del controlador, mediante la edición de los valores predeterminados para decir: defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }

Eso es todo, ahora se puede ejecutar sitio y utilizar ambos controladores API y Web.

Cuestiones relacionadas