2012-05-16 12 views
13

¿Cómo obtengo API web para renderizar una vista Razor usando el modelo que devuelve? ¿Y solo XML/JSON cuando se configuran los encabezados de aceptación (o extensión)? ¿Esto es posible?Web API - Renderizar la vista de Navaja por defecto?

Parece una locura requerir un conjunto de controladores para renderizar HTML y otro para JSON/XML si están trabajando en los mismos modelos.

Actualización Darrel Miller ya ha escrito un ViewEngineFormatter for Razor que podría hacer el truco, aunque todavía no lo haya intentado.

Respuesta

4

Parece una locura requerir un conjunto de controladores para representar HTML y otro para JSON/XML si están trabajando en los mismos modelos.

AFAIK, así es como es. Los controladores estándar se deben usar para representar HTML y ApiControllers para JSON/XML.

+0

¡Qué vergüenza, pero gracias! –

+0

@ShaneCourtrille ¿qué pensaban entonces llamándolo ApiController? ;) Pero estoy de acuerdo, mi principal frustración simplemente se debe a la falta de conectividad entre MVC y la API web –

3

Parece una locura requerir un conjunto de controladores para representar HTML y otro para JSON/XML si están trabajando en los mismos modelos.

La API web es exactamente como se llama: una tecnología para crear API.

Si está creando una aplicación ASP.NET MVC y desea devolver algo de JSON para su propio propósito, entonces no necesita negociación de contenido, etc. por lo tanto, no necesita la API web (solo use el antiguo buen JsonResult) .

Si desea crear una API reutilizable que Web API es lo que necesita, pero su aplicación cliente debe consumirlo de la misma manera que todos los demás.

Web API no pretende ser un "martillo" para "clavar" todas las solicitudes que no sean HTML: úselo cuando lo necesite.

+0

En mi humilde opinión, una API pública no es necesariamente distinta de una aplicación MVC, pero MVC no se presta bien para renderizar diferentes medios tipos. Es una lástima que no puedas obtener lo mejor de ambos mundos (FubuMVC y otros a un lado). –

+0

También debe recordar que ASP.NET MVC es solo una muestra aquí, porque la API web puede ser alojada automáticamente o ser parte de la aplicación WebForms. Al final, no le impide crear el formateador de tipo de medios que respaldaría este escenario; simplemente no es el mejor diseño. – tpeczek

+0

De hecho, alguien ya tiene - https://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib.Formatting.RazorViewEngine/ViewEngineFormatter.cs - aunque sería curioso por qué considera que esta ruta no sería el mejor diseño ? gracias –

5

Sí, así es como está diseñado para: API web para datos y MVC para visualizaciones renderizadas. Sé que algunas personas intentarán agregar soporte de motor de vista a la API web, pero no está diseñado para ello.

Mi opinión personal sobre esto es que paralelo world entre MVC y Web API (que es la fuente de la mayoría de las críticas mientras que la comunidad generalmente elogia el producto) es principalmente una consecuencia del hecho de que Web API se ha agregado a MVC sin tener una referencia (o conocimiento de ello). Como dijo Jon Galloway en un podcast reciente, si el equipo tuviera conocimiento de HTTP que tienen ahora (además de la popularidad de la API REST ahora que no tenían entonces), habrían diseñado una sola tubería servicio de datos y vista renderizada por igual.

sólo puedo especular que la futura versión de API/Web MVC se presenta como una única canalización . De hecho, este mundo paralelo podría haber sido un plan cuidadoso para unificarlos en el futuro cercano.

10

Hice una pregunta similar sobre esto en el pasado en StackOverflow, porque quería hacer lo mismo. Sin embargo, finalmente terminé con un área "Api" y un conjunto de controladores, y un conjunto estándar de controladores MVC para el sitio web.

En retrospectiva esto en realidad no fue algo malo. He descubierto que, de todos modos, tiendo a hacer cosas diferentes en cada grupo de controladores. Mis puntos de vista no son solo CRUD, sino que tienden a contener datos contextuales adicionales, por lo que devolver modelos de vista específicos a esa página es agradable.

Creo que si hubiera cumplido con mi objetivo de combinar los dos podría haber terminado con controladores demasiado complicados o una experiencia de usuario que no fue tan óptima como podría haber sido. Entonces, aunque esta no es una respuesta directa a su pregunta, en mi experiencia, no poder hacer esto podría no ser tan malo.

En su lugar, terminé con un conjunto rico de constructores y comandos a los que la mayoría de mis controladores delegan. De esa manera puedo reutilizar la mayor parte de la lógica del controlador, mientras que ser capaz de hacer cosas específicas para el API con respecto a la web:

http://www.paulstovell.com/clean-aspnet-mvc-controllers

+0

, bien para saber dónde terminaste. De hecho, ya leí tu publicación en los controladores limpios hace un tiempo, así que muchas gracias :) En términos de datos contextuales, ¿se comparten los datos de visualización? Si hubieras utilizado la ruta de ActionFilter para completarlo, ¿habría resultado que API/front-end tuviese el mismo modelo de vista de nuevo? ¿O descubriste que aún existen diferencias más allá de eso? –

+0

Todavía había diferencias, porque la interfaz de usuario se centraba más en tareas mientras que la API se centraba más en CRUD. –

1

Busco algo similar a esto, pero no del todo. Al recorrer la web, encontré un par de publicaciones de Fredrik Normen. Escribe sobre este espacio de problema exacto y, de hecho, identifica una solución de terceros en la segunda publicación mencionada. Básicamente, la solución implica la creación de un MediaTypeFormatter personalizado que sepa cómo manejar vistas utilizando el motor Razor provisto por Microsoft (through the use of a third-party library).

Esperamos que Microsoft va a poner en práctica algo pronto en la Web API como Hipermedia parece estar ganando impulso.

Espero que esto ayude!

Cuestiones relacionadas