Существует ли эквивалент respond_to format.xml Ruby on Rails, и т.д. в ASP.NET MVC?

В 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?

11
задан mynameiscoffey 9 January 2010 в 00:01
поделиться

3 ответа

Итак, я поиграл с этим и добавил следующие маршруты в 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" }) %>

6
ответ дан 3 December 2019 в 07:37
поделиться

В ASP.NET MVC нет встроенной поддержки для этого. Однако есть образец инструментария REST, который вы можете загрузить:

Подробнее о наборе инструментов REST в блоге Фила .

В наборе инструментов REST есть «поставщики форматов», которые определяют типы результатов для различных запросов. Руководство доступно для загрузки для ASP.NET MVC 1.0. Вот выдержка из руководства:

Теперь этот контроллер может возвращать XML или JSON в качестве ответа на запрос HTTP GET. Формат определяется на основе типа контента запроса или типа (ов) контента в заголовке Accepts запроса.

2
ответ дан 3 December 2019 в 07:37
поделиться

(угадайте)

Это ссылка на ключ , который не имеет обращения. Случай определяется тем, находится ли клавиша переключения также вниз.

-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, а также переменные в маршруте.

8
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: