В 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
в этом случае был бы эквивалент public ActionResult Index()
в ASP.NET Контроллер MVC и позволил бы следующие вызовы:
http://example.com/Movies/Index
возвраты как страница HTML от представления index.html.erb
(думайте 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?
Итак, я поиграл с этим и добавил следующие маршруты в 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("Тест", "MovieList") %>
Ссылки на /Home/MovieList.json
<%= Html. ActionLink("JSON", "MovieList", new { format = "json" }) %>
В ASP.NET MVC нет встроенной поддержки для этого. Однако есть образец инструментария REST, который вы можете загрузить:
Подробнее о наборе инструментов REST в блоге Фила .
В наборе инструментов REST есть «поставщики форматов», которые определяют типы результатов для различных запросов. Руководство доступно для загрузки для ASP.NET MVC 1.0. Вот выдержка из руководства:
Теперь этот контроллер может возвращать XML или JSON в качестве ответа на запрос HTTP GET. Формат определяется на основе типа контента запроса или типа (ов) контента в заголовке Accepts запроса.
(угадайте)
Это ссылка на ключ , который не имеет обращения. Случай определяется тем, находится ли клавиша переключения также вниз.
-121--4780016-Без большего контекста трудно сказать. Они могут пытаться ограничить область действия определенных переменных. Я не знаю конкретных правил определения области действия PHP, но они могут пытаться гарантировать, что переменные, измененные внутри этого оператора переключения, не влияют на вещи за пределами блока. Или они могут использовать RAI образцы.
-121--3941981-В своем блоге я подробно описал метод обработки этого, который функционирует так же, как и в 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, а также переменные в маршруте.