Ответ 1
Когда использовать
JsonResult
надActionResult
Я обычно возвращаю конкретные результаты (например, JsonResult
, ViewResult
), и есть мои профи:
- Интерфейс контроллера дает больше информации о его поведении. Легче работать с частичными или общими представлениями, когда вы точно указываете
PartialViewResult
иViewResult
как результат. - Легче протестировать, так как не нужно приводить результат к конкретным типам в модульных тестах.
Есть некоторые ссылки, в которых люди поддерживают этот подход:
- Какая разница между ActionResult и ViewResult для метода действий?
- Должны ли методы контроллера ASP.NET MVC возвращать ActionResult?
- ViewResult против ActionResult
Существует цитата из Pro ASP.NET MVC 3 Framework:
Примечание. Обратите внимание, что тип возвращаемого значения для метода действия в листинг
ViewResult
. Метод будет компилироваться и работать так же хорошо если бы мы указали более общий типActionResult
. Фактически, некоторые Программисты MVC будут определять результат каждого метода действий какActionResult
, даже когда они знают, что он всегда будет возвращать больше определенного типа. Мы проявили особую старательность в этой практике в следующие примеры, чтобы дать понять, как вы можете использовать каждый результат типа, но мы склонны быть более расслабленными в реальных проектах.
Я использовал бы ActionResult
над конкретным, только если действие должно возвращать разные типы результатов. Но это не такая распространенная ситуация.
Я хотел бы также добавить, что ActionResult
является абстрактным классом, поэтому вы не можете просто создать экземпляр этого типа и вернуть его. JsonResult
является конкретным, поэтому вы можете создать его экземпляр и вернуться из метода действия. Существует много других типов, полученных из ActionResult
, и в основном все они используются для переопределения ExecuteResult
.
public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext context);
}
Этот метод вызывается ControllerActionInvoker
и реализует логическую запись данных в объект response
.
ControllerActionInvoker
не знает о конкретных результатах, поэтому может обрабатывать любой результат, полученный из ActionResult
, и реализует ExecuteResult
.
В обоих случаях вы возвращаете экземпляр типа JsonResult
в свой пример и Json(model)
, это просто метод Factory, который создает экземпляр JsonResult
.
Существует еще один вопрос SO Лучше ли иметь тип данных метода как можно более конкретным или более общим?, где лучшие методы для параметров метода и возврата значения обсуждаются.
Общая идея предоставляет абстрактные типы в качестве параметров, чтобы ваш метод мог обрабатывать более широкий диапазон параметров; возвращает достаточно конкретные типы, чтобы ваши клиенты не могли их отличать или конвертировать.