В чем разница между ViewResult()
и ActionResult()
в ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
asp.net
asp.net-mvc
Domnic
источник
источник
Ответы:
ActionResult - это абстрактный класс, который может иметь несколько подтипов.
ActionResult Подтипы
ViewResult - отображает указанное представление в поток ответов.
PartialViewResult - визуализирует указанное частичное представление в поток ответов
EmptyResult - возвращается пустой ответ
RedirectResult - выполняет перенаправление HTTP на указанный URL
RedirectToRouteResult - выполняет перенаправление HTTP на URL-адрес, который определяется механизмом маршрутизации на основе заданных данных маршрута
JsonResult - сериализует данный объект ViewData в формат JSON
JavaScriptResult - возвращает фрагмент кода JavaScript, который может быть выполнен на клиенте
ContentResult - записывает содержимое в поток ответов без необходимости просмотра
FileContentResult - возвращает файл клиенту
FileStreamResult - возвращает файл клиенту, который предоставляется потоком
FilePathResult - возвращает файл клиенту
Ресурсы
источник
ActionResult - это абстрактный класс.
ViewResult происходит от ActionResult . Другие производные классы включают JsonResult и PartialViewResult .
Вы объявляете это таким образом, чтобы использовать полиморфизм и возвращать разные типы в одном и том же методе.
например:
источник
По той же причине, по которой вы не пишете каждый метод каждого класса для возврата «объекта». Вы должны быть как можно более конкретны. Это особенно ценно, если вы планируете писать модульные тесты. Больше не нужно тестировать возвращаемые типы и / или приводить результат.
источник
ViewResult является подклассом ActionResult. Метод View возвращает ViewResult. Так что на самом деле эти два фрагмента кода делают одно и то же. Единственное отличие состоит в том, что с ActionResult ваш контроллер не обещает возвращать представление - вы можете изменить тело метода для условного возврата RedirectResult или чего-то еще без изменения определения метода.
источник
В то время как другие ответы правильно отметили различия, обратите внимание, что если вы на самом деле возвращаете только ViewResult, лучше вернуть более конкретный тип, а не базовый тип ActionResult. Очевидное исключение из этого принципа - когда ваш метод возвращает несколько типов, полученных из ActionResult.
Для полного обсуждения причин этого принципа, пожалуйста, смотрите соответствующее обсуждение здесь: Должны ли методы контроллера ASP.NET MVC возвращать ActionResult?
источник
В контроллере можно использовать следующий синтаксис
В приведенном выше примере меняется только тип возвращаемого значения. один возвращается,
ViewResult
тогда как другой возвращаетсяActionResult
.ActionResult - это абстрактный класс. Он может принять:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult и т. Д.
Это
ViewResult
подклассActionResult
.источник
В Контроллере я указал приведенный ниже код с помощью ActionResult, который является базовым классом, который может иметь 11 подтипов в MVC, таких как: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePreamResult, FilePreamResult.
Точно так же мы можем вернуть все эти 11 подтипов, используя ActionResult () без явного указания каждого метода подтипа. ActionResult - лучшая вещь, если вы возвращаете различные типы представлений.
источник
Чтобы сэкономить ваше время, вот ответ по ссылке в предыдущем ответе на https://forums.asp.net/t/1448398.aspx.
ActionResult - это абстрактный класс, и это базовый класс для класса ViewResult.
В среде MVC он использует класс ActionResult для ссылки на объект, который возвращает ваш метод действия. И вызывает метод ExecuteResult для этого.
И ViewResult является реализацией для этого абстрактного класса. Он попытается найти страницу просмотра (обычно aspx-страницу) по некоторым предопределенным путям (/ views / controllername /, / views / shared / и т. Д.) По заданному имени представления.
Обычно рекомендуется, чтобы ваш метод возвращал более конкретный класс. Поэтому, если вы уверены, что ваш метод действия вернет какую-либо страницу просмотра, вы можете использовать ViewResult. Но если у вашего метода действия может быть другое поведение, например, вы можете визуализировать представление или выполнить перенаправление. Вы можете использовать более общий базовый класс ActionResult в качестве возвращаемого типа.
источник