2010-01-08 10 views
11

en Ruby on Rails se puede escribir un controlador de acción simple, como:¿Existe un equivalente a respond_to format.xml, etc. de Ruby on Rails en ASP.Net MVC?

def index 
    @movies = Movies.find(:all) 

    respond_to do |format| 
     format.html #index.html.erb 
     format.xml { render :xml => @movies } 
     format.json { render :json => @movies } 
    end 
end 

Para aquellos no familiarizados con RoR, def index en este caso sería el equivalente de public ActionResult Index() dentro de un controlador de ASP.Net MVC y permitiría a la llamadas siguientes:

http://example.com/Movies/Index devuelve como una página hTML desde el punto de vista index.html.erb (piensan index.aspx)
http://example.com/Movies/Index.xml devuelve los mismos datos en formato XML (@movies es el objeto que contiene los datos de todos los puntos de vista del uso)
http://example.com/Movies/Index.json devuelve una cadena JSON, útil cuando se realizan llamadas JavaScript necesitan los mismos datos/lógica

Un flujo equivalente en ASP.Net MVC haría (si es posible) es probable ser algo como esto (si pudiera ser menos detallado, incluso mejor):

public ActionResult Index() 
{ 
    Movies movies = dataContext.GetMovies(); 
    // any other logic goes here 

    switch (format) 
    { 
     case "xml": 
      return View("XMLVIEW"); 
      break; 
     case "json": 
      return View("JSONVIEW"); 
      break; 
     default: 
      return View(); 
    } 
} 

Esto es muy práctico no tener que llevar un montón de diferentes acciones estorbar encima de su controlador, hay una manera de hacer algo similar en ASP.Net MVC?

+0

No soy un Ruby pero ¿dónde está | vienen de, un encabezado de solicitud? –

+0

Agregué algunas aclaraciones sobre cómo funciona, espero que ayude. – mynameiscoffey

Respuesta

6

Así que he estado jugando con esto y añade las siguientes rutas a RegisterRoutes():

routes.MapRoute("FormatAction", "{controller}/{action}.{format}", 
       new { controller = "Home", action = "Index" }); 

routes.MapRoute("FormatID", "{controller}/{action}/{id}.{format}", 
       new { controller = "Home", action = "Index", id = "" }); 

Ahora cada vez que necesito una acción de controlador a ser "conscientes formato" Simplemente añadir un argumento string format a ella (como):

// Within Home Controller 
public ActionResult MovieList(string format) 
{ 
    List<Movie> movies = CreateMovieList(); 

    if (format == "json") 
     return Json(movies); 

    return View(movies); 
} 

Ahora cuando llamo /Home/MovieList devuelve la vista hTML estándar, como siempre, y si hago una llamada a /Home/MovieList.json devuelve un strin serializado JSON g de los mismos datos pasados ​​a la vista. Esto funcionará para cualquier modelo de vista que estés usando, estoy usando una lista muy simple por el simple hecho de retocar.

Para hacer las cosas aún mejor incluso se puede hacer lo siguiente dentro de los puntos de vista:

Enlaces a /Home/MovieList
<%= Html.ActionLink("Test", "MovieList") %>

Enlaces a /Home/MovieList.json
<%= Html.ActionLink("JSON", "MovieList", new { format = "json" }) %>

2

No hay soporte integrado para esto en ASP.NET MVC. Sin embargo, hay un conjunto de herramientas RESTO ejemplo que puede descargar:

Más información sobre el kit de herramientas REST en Phil's blog.

El kit de herramientas REST tiene "proveedores de formatos" que definen los tipos de resultados para varias solicitudes. El documento de orientación está disponible en la descarga de ASP.NET MVC 1.0. Aquí hay un extracto del documento de orientación:

Este controlador ahora puede devolver XML o JSON como la respuesta a una solicitud HTTP GET. El formato se determina según el tipo de contenido de la solicitud o el tipo de contenido en el encabezado Acepta de la solicitud.

8

En mi blog, he detalla un método para manejar esto que funciona de una manera muy similar a cómo funciona en Ruby on Rails. Puede encontrar el enlace en la parte inferior del poste, pero aquí es una muestra de que el resultado final:

public ActionResult Index() 
{ 
    return RespondTo(format => 
    { 
     format.Html =() => View(); 
     format.Json =() => Json(new { message = "hello world" }); 
    }); 
} 

Aquí está el enlace a la entrada: http://icanhascode.com/2009/05/simple-ror-respond_to-functionality-in-aspnet-mvc/

Puede manejar detectar el tipo correcto a través de HTTP encabezados así como variables en la ruta.