2010-01-08 8 views
11

Trong Ruby on Rails bạn có thể viết một hành động điều khiển đơn giản như:Có tương đương với Ruby on Rails 'respond_to format.xml, vv trong ASP.Net MVC không?

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 

Đối với những người không quen với RoR, def index trong trường hợp này sẽ tương đương với public ActionResult Index() trong một điều khiển ASP.Net MVC và sẽ cho phép cuộc gọi sau đây:

http://example.com/Movies/Index lợi nhuận như một trang html từ quan điểm index.html.erb (nghĩ index.aspx)
http://example.com/Movies/Index.xml trả về cùng một dữ liệu ở định dạng xml (@movies là đối tượng chứa dữ liệu tất cả các quan điểm sử dụng)
http://example.com/Movies/Index.json trả về một chuỗi JSON, hữu ích khi thực hiện cuộc gọi javascript cần cùng một dữ liệu/logic

Một luồng tương đương trong ASP.Net MVC sẽ (nếu có thể) có thể trông giống như thế này (nếu nó có thể ít tiết, thậm chí tốt hơn):

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

điều này thực sự tiện dụng không cần phải giữ một loạt các hành động khác nhau cluttering lên điều khiển của bạn, là có một cách để làm điều gì đó tương tự trong ASP.Net MVC?

+0

Tôi không phải là anh chàng Ruby nhưng ở đâu | định dạng | đến từ, tiêu đề yêu cầu? –

+0

Thêm một số làm rõ làm thế nào nó hoạt động, hy vọng nó sẽ giúp. – mynameiscoffey

Trả lời

6

Vì vậy, tôi đã chơi với điều này và bổ sung các tuyến đường sau để 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 = "" }); 

Bây giờ bất cứ khi nào tôi cần một hành động điều khiển được "định dạng biết:" Tôi chỉ cần thêm một đối số string format với nó (như):

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

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

    return View(movies); 
} 

Bây giờ khi tôi gọi /Home/MovieList nó trả về chế độ xem chuẩn html như mọi khi và nếu tôi thực hiện một cuộc gọi đến /Home/MovieList.json nó trả về một strin serialized JSON g của cùng một dữ liệu được chuyển vào khung nhìn. Điều này sẽ làm việc cho bất kỳ mô hình xem bạn đang sử dụng, tôi đang sử dụng một danh sách rất đơn giản chỉ vì lợi ích của mày mò.

Để làm cho mọi việc tốt hơn thậm chí bạn có thể làm như sau trong quan điểm:

Liên kết đến /Home/MovieList
<%= Html.ActionLink("Test", "MovieList") %>

Liên kết đến /Home/MovieList.json
<%= Html.ActionLink("JSON", "MovieList", new { format = "json" }) %>

2

Không có hỗ trợ tích hợp cho điều này trong ASP.NET MVC. Tuy nhiên, có một bộ công cụ REST của mẫu mà bạn có thể tải về:

Đọc thêm về bộ công cụ REST trên Phil's blog.

Bộ công cụ REST có "nhà cung cấp định dạng" xác định loại kết quả cho các yêu cầu khác nhau. Tài liệu hướng dẫn có sẵn trong phần tải về cho ASP.NET MVC 1.0. Dưới đây là một đoạn trích từ tài liệu hướng dẫn:

Bộ điều khiển này hiện có thể trả lại XML hoặc JSON làm phản hồi cho yêu cầu HTTP GET. Định dạng được xác định dựa trên loại nội dung của yêu cầu hoặc (các) loại nội dung trong tiêu đề Accepts của yêu cầu.

8

Trên blog của tôi, tôi đã chi tiết một phương thức xử lý điều này hoạt động theo cách rất giống với cách nó hoạt động trong Ruby on Rails. Bạn có thể tìm liên kết ở dưới cùng của bài viết, nhưng đây là một mẫu của kết quả cuối cùng:

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

Dưới đây là các liên kết đến các bài: http://icanhascode.com/2009/05/simple-ror-respond_to-functionality-in-aspnet-mvc/

Nó có thể xử lý phát hiện đúng loại thông qua HTTP tiêu đề cũng như các biến trong tuyến đường.