在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
对于那些不熟悉RoR的人,在这种情况下,def index
将等同于ASP.Net MVC控制器中的public ActionResult Index()
,并允许以下调用:
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 :(得分: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头以及路径中的变量来处理正确的类型。
答案 1 :(得分: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序列化字符串。这适用于你碰巧使用的任何视图模型,我只是为了修补而使用一个非常简单的列表。
为了让事情变得更好,您甚至可以在视图中执行以下操作:
/Home/MovieList
的链接
<%= Html.ActionLink("Test", "MovieList") %>
/Home/MovieList.json
的链接
<%= Html.ActionLink("JSON", "MovieList", new { format = "json" }) %>
答案 2 :(得分:2)
ASP.NET MVC中没有对此的内置支持。但是,您可以下载一个示例REST工具包:
在Phil's blog上阅读有关REST工具包的更多信息。
REST工具包具有“格式提供程序”,用于定义各种请求的结果类型。 ASP.NET MVC 1.0的下载中提供了指导文档。以下是指导文件的摘录:
此控制器现在可以返回XML或JSON作为对HTTP GET请求的响应。格式是根据请求的内容类型或请求的Accepts标头中的内容类型确定的。