2010-01-08 71 views
11

在Ruby on Rails的可以編寫一個簡單的控制器的動作,例如:在ASP.Net MVC中是否有與Ruby on Rails的respond_to format.xml等效的東西?

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 

對於那些不熟悉的RoR,def index在這種情況下將是public ActionResult Index()一個ASP.Net MVC控制器內的等效和將允許下列調用:

http://example.com/Movies/Index返回作爲來自視圖index.html.erb一個html頁面(認爲的Index.aspx)
http://example.com/Movies/Index.xml返回XML格式的相同數據(@movies是包含所有的視圖使用數據中的對象)
http://example.com/Movies/Index.json製作時返回一個JSON字符串,實用的javascript調用需要相同的數據/邏輯

在ASP.Net MVC的等效流將(如果可能的話)可能是這個樣子(即使能夠更簡潔,甚至越好):

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

這是非常方便的不必保持了一堆不同的動作弄亂你的控制器,有沒有辦法做到在ASP.Net MVC類似的東西?

+0

我不是一個紅寶石男人,但在哪裏|格式|來自請求頭? – 2010-01-08 20:45:51

+0

增加了一些功能說明,希望它有幫助。 – mynameiscoffey 2010-01-09 00:01:31

回答

6

所以我一直在玩這個,並增加了以下路線的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 = "" }); 

現在,每當我需要一個控制器動作是「格式化知道」我只需要添加一個string format參數它(比如):

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

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

    return View(movies); 
} 

現在,當我把它/Home/MovieList一如既往返回標準HTML視圖,如果我打個電話給/Home/MovieList.json它返回一個JSON序列〜應變g的相同數據傳入視圖。這將適用於您正在使用的任何視圖模型,我只是爲了修補而使用了一個非常簡單的列表。

爲了使事情變得更好,你甚至可以做視圖中的以下內容:

鏈接/Home/MovieList
<%= Html.ActionLink("Test", "MovieList") %>

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

2

在ASP.NET MVC中沒有對此的內置支持。然而,有一個樣品REST工具包,您可以下載:

閱讀有關Phil's blog上的REST工具包的更多信息。

REST工具包具有「格式提供程序」,用於定義各種請求的結果類型。 ASP.NET MVC 1.0下載了指導性文檔。以下是指導文檔的摘錄:

此控制器現在可以返回XML或JSON作爲對HTTP GET請求的響應。格式根據請求的內容類型或請求的接受報頭中的內容類型確定。

8

在我的博客,我已經詳細介紹了一種處理此方法的方法,它的功能與Ruby on Rails中的方式非常類似。您可以在文章底部的鏈接,但這裏是最終結果的一個樣本:

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

這裏的鏈接的帖子:http://icanhascode.com/2009/05/simple-ror-respond_to-functionality-in-aspnet-mvc/

它可以處理檢測正確的類型通過HTTP頭文件以及路由中的變量。

相關問題