Веб-API - рендеринг представления Razor по умолчанию?

Как заставить веб-API отображать представление Razor с использованием модели, которую он возвращает? И только XML/JSON, когда установлены заголовки accept (или .extension)? Это вообще возможно?

Кажется безумием требовать один набор контроллеров для рендеринга HTML и другой для JSON/XML, если они работают с одними и теми же моделями.

Обновление Даррел Миллер уже написал ViewEngineFormatter for Razor, который мог бы помочь, хотя еще не пробовал.


person James Crowley    schedule 16.05.2012    source источник


Ответы (5)


Я задавал аналогичный вопрос об этом в прошлом на StackOverflow, потому что хотел сделать то же самое. Однако в итоге я получил область «Api» и набор контроллеров, а также стандартный набор контроллеров MVC для веб-сайта.

Оглядываясь назад, это на самом деле не было чем-то плохим. Я обнаружил, что в любом случае я склонен делать разные вещи в каждом наборе контроллеров. Мои представления не просто CRUD, но, как правило, содержат дополнительные контекстные данные, поэтому приятно возвращать модели представлений, специфичные для этой страницы.

Я думаю, что если бы я придерживался своей цели объединить два, я мог бы получить либо чрезмерно сложные контроллеры, либо пользовательский интерфейс, который был бы не таким оптимальным, как мог бы быть. Так что, хотя это не прямой ответ на ваш вопрос, по моему опыту, невозможность сделать это может быть не такой уж плохой вещью.

Вместо этого я получил богатый набор компоновщиков и команд, которым делегирует большинство моих контроллеров. Таким образом, я могу повторно использовать большую часть логики контроллера, в то же время имея возможность делать определенные вещи для API, а не для Интернета:

http://www.paulstovell.com/clean-aspnet-mvc-controllers

person Paul Stovell    schedule 16.05.2012
comment
приятно знать, где вы оказались - я действительно уже читал ваш пост о чистых контроллерах некоторое время назад, так что спасибо :) С точки зрения контекстных данных, это данные общего представления? Если бы вы пошли по маршруту ActionFilter для его заполнения, привело бы это к тому, что API/интерфейсный интерфейс снова имел бы ту же модель представления - или вы обнаружили, что помимо этого все еще есть различия? - person James Crowley; 16.05.2012
comment
Различия все еще были, потому что пользовательский интерфейс был больше ориентирован на задачи, а API — на CRUD. - person Paul Stovell; 01.06.2012

Да, именно так он разработан для: Веб-API для данных и MVC для визуализированных представлений. Я знаю, что некоторые люди попытаются добавить поддержку механизма представления в веб-API, но он не предназначен для этого.

Мое личное мнение по этому поводу заключается в том, что этот параллельный мир между MVC и Web API (который является источником большинства критических замечаний, в то время как сообщество в целом хвалит продукт) в основном является следствием того факта, что Web API был добавлен в MVC без ссылки (или знания о ней).

Как сказал Джон Гэллоуэй в недавнем подкасте, если бы у команды были знания HTTP, которые у них есть сейчас (а также ретроспективное понимание популярности REST API сейчас, которого у них не было тогда), они разработали бы только один конвейер, обслуживающий данные и отображающий взгляд одинаковый.

Я могу только предположить, что будущая версия MVC/Web API будет представлена ​​как единый конвейер. Фактически, этот параллельный мир мог быть тщательно продуманным планом их объединения в ближайшем будущем.

person Aliostad    schedule 16.05.2012

Кажется безумием требовать один набор контроллеров для рендеринга HTML и другой для JSON/XML, если они работают с одними и теми же моделями.

АФАИК, так оно и есть. Для рендеринга HTML и ApiControllers для JSON/XML следует использовать стандартные контроллеры.

person Darin Dimitrov    schedule 16.05.2012
comment
@ShaneCourtrile, о чем они тогда думали, называя это ApiController? ;) Но согласен, мое главное разочарование просто связано с отсутствием связи между MVC и Web API. - person James Crowley; 16.05.2012

Кажется безумием требовать один набор контроллеров для рендеринга HTML и другой для JSON/XML, если они работают с одними и теми же моделями.

Web API — это именно то, что называется — технология создания API.

Если вы создаете приложение ASP.NET MVC и хотите вернуть некоторый JSON для своих собственных целей, вам не нужно согласование содержимого и т. д., поэтому вам не нужен веб-API (просто используйте старый добрый JsonResult).

Если вы хотите создать повторно используемый API, вам нужен Web API, но ваше клиентское приложение должно использовать его так же, как и все остальные.

Web API не предназначен быть "молотком" для "прибивания" всех не-HTML-запросов - используйте его, когда вам это нужно.

person tpeczek    schedule 16.05.2012
comment
ИМХО, общедоступный API не обязательно отличается от приложения MVC, но сам по себе MVC не подходит для рендеринга различных типов мультимедиа. Просто жаль, что вы не можете получить лучшее из обоих миров (кроме FubuMVC и других). - person James Crowley; 16.05.2012
comment
Вы также должны помнить, что ASP.NET MVC здесь является лишь примером, поскольку веб-API может размещаться самостоятельно или быть частью приложения WebForms. В конце концов, ничто не мешает вам создать средство форматирования медиа-типа, которое поддерживало бы этот сценарий - это просто не лучший дизайн. - person tpeczek; 16.05.2012
comment
На самом деле у кого-то уже есть - github.com/ WebApiContrib/WebAPIContrib/blob/master/src/ - хотя было бы любопытно, почему вы считаете, что этот маршрут не лучший дизайн? спасибо - person James Crowley; 16.05.2012
comment
Павел уже выделил наиболее общие аспекты. Фактические представления, как правило, содержат много дополнительных данных, поэтому ViewModel является таким распространенным шаблоном. Веб-API предназначен для гораздо более прямой привязки к фактической модели, что делает его идеальным решением для лежащего в основе CRUD, но не для всего уровня представления. Это не меняет того факта, что лучшая интеграция конвейеров для ASP.NET MVC и веб-API дала бы некоторые технические преимущества (тем не менее, логическое разделение имело бы смысл). - person tpeczek; 17.05.2012
comment
WebApi должен быть расширенным набором MVC. Нет никаких причин для того, чтобы инфраструктура http API, которая поддерживает согласование контента, не поддерживала text/html, поскольку это один из наиболее распространенных типов мультимедиа во всемирной паутине. Абсурдно иметь 2 отдельных контроллера (и 2 отдельных URL-адреса, маршрутизацию, инфраструктуры, шаблоны и т. д.) для отображения JSON и html-представлений одного и того же ресурса. - person Sheepy; 30.01.2015

Я ищу что-то похожее на это, но не совсем. Прошерстив Интернет, я нашел пару постов Фредрика Нормена. Он пишет именно об этой проблемной области и фактически указывает стороннее решение во втором сообщении в списке. По сути, решение включает в себя создание пользовательского MediaTypeFormatter, который знает, как обрабатывать представления с помощью механизма Razor, предоставленного Microsoft (с помощью сторонняя библиотека).

Надеюсь, Microsoft скоро реализует что-то в Web API, поскольку Hypermedia, похоже, набирает обороты.

Надеюсь это поможет!

person Ryan V    schedule 18.12.2013