2010-01-08 9 views
11

In Ruby on Rails Sie eine einfache Controller-Aktion wie schreiben:Gibt es in ASP.Net MVC ein Äquivalent zu reply_to format.xml von Ruby on Rails?

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 

Für diejenigen, die nicht mit RoR, def index in diesem Fall wäre das Äquivalent von public ActionResult Index() innerhalb einer ASP.Net MVC-Controller und ermöglicht es dem folgende Aufrufe:

http://example.com/Movies/Index kehrt als hTML-Seite aus der Sicht index.html.erb (man denke index.aspx)
http://example.com/Movies/Index.xml gibt die gleichen Daten im xML-Format (@movies ist das Objekt, die Daten alle Ansichten enthalten, verwenden)
http://example.com/Movies/Index.json gibt einen JSON-String, nützlich, wenn JavaScript Anrufe die gleichen Daten benötigen/Logik

Einen äquivalenter Fluss in ASP.Net MVC würde (wenn möglich) so etwas wie dies wahrscheinlich aussehen (wenn es weniger ausführlich sein könnte, auch besser):

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(); 
    } 
} 

Das ist wirklich praktisch, die nicht eine Reihe von verschiedenen Aktionen zu halten unübersichtlich Ihren Controller, ist es eine Möglichkeit, etwas ähnliches in ASP.Net MVC zu tun?

+0

Ich bin kein Ruby Typ, aber wo ist | Format | komm her, ein Anfragekopf? –

+0

Ein paar Erläuterungen dazu, wie es funktioniert, hoffe es hilft. – mynameiscoffey

Antwort

6

Ich habe mit diesem und hinzugefügt, um die folgenden Strecken zu RegisterRoutes() spielen So es (wie): Jetzt

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

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

    return View(movies); 
} 

, wenn ich rufe /Home/MovieList es gibt die Standard-hTML-Ansicht, wie immer, und wenn ich einen Anruf zu /Home/MovieList.json es gibt einen JSON serialisiert strin g der gleichen Daten in die Ansicht übergeben. Dies funktioniert für jedes Ansichtsmodell, das Sie gerade verwenden. Ich benutze eine sehr einfache Liste, nur um zu basteln.

Um die Dinge noch besser machen Sie auch die folgenden in den Ansichten tun können:

Links zu /Home/MovieList
<%= Html.ActionLink("Test", "MovieList") %>

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

2

In ASP.NET MVC ist keine integrierte Unterstützung dafür vorhanden. Allerdings gibt es eine Probe REST-Toolkit, das Sie herunterladen können:

Lesen Sie mehr über das REST-Toolkit auf Phil's blog.

Das REST-Toolkit verfügt über "Formatanbieter", die Ergebnistypen für verschiedene Anforderungen definieren. Das Leitfadendokument ist im Download für ASP.NET MVC 1.0 verfügbar. Hier ein Auszug aus dem Leitfaden:

Dieser Controller kann jetzt XML oder JSON als Antwort auf eine HTTP GET-Anfrage zurückgeben. Das Format wird auf der Grundlage des Inhaltstyps der Anforderung oder des Inhaltstyps (s) in der Accepts-Kopfzeile der Anforderung bestimmt.

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

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

Nun, wenn ich eine Controller-Aktion müssen „format bewusst“ Ich habe einfach fügen Sie ein string format Argument zu sein:

8

Auf meinem Blog, ich habe detailliert eine Methode zur Handhabung dieser, die auf sehr ähnliche Weise funktioniert, wie es in Ruby on Rails funktioniert. Sie können den Link am unteren Rand der Post finden, aber hier ist eine Probe des Endergebnisses:

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

Hier ist der Link zum Beitrag: http://icanhascode.com/2009/05/simple-ror-respond_to-functionality-in-aspnet-mvc/

Es verarbeiten kann die richtige Art über HTTP Erkennung Header sowie Variablen in der Route.