Должны ли методы контроллера ASP.NET MVC возвращать ActionResult?

StackOverflow https://stackoverflow.com/questions/1021568

Вопрос

Будучи новичком в ASP.NET MVC, я задавался вопросом о сигнатуре методов контроллера.Во всех примерах, которые я видел, они всегда возвращают ActionResult, даже если на самом деле они возвращают экземпляр ViewResult или что-то подобное.

Вот часто встречающийся пример:

public ActionResult Index()
{
    return this.View();
}

В таком случае не имело бы смысла объявить метод как public ViewResult Index(), и усилить поддержку типов?

Эксперименты показывают, что это работает, поэтому кажется возможным.

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

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

Есть ли какие-либо другие соображения, о которых я не знаю, или мне следует просто объявить методы моего контроллера с определенными типами возврата?

Это было полезно?

Решение

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

Стивен Сандерсон также рекомендует возвращать определенные типы в своей книге Pro ASP.NET MVC Framework . Посмотрите на цитату ниже:

" Этот метод действия специально объявляет, что он возвращает экземпляр ViewResult. Это будет работать точно так же, если бы вместо метода, возвращаемого методом, был ActionResult (базовый класс для всех результатов действия). Фактически, некоторые программисты ASP.NET MVC объявляют все свои методы действия как возвращающие неспецифический ActionResult, даже если они точно знают, что он всегда будет возвращать один конкретный подкласс. Однако в объектно-ориентированном программировании хорошо известен принцип, согласно которому методы должны возвращать наиболее конкретный тип, который они могут (а также принимать наиболее общие типы параметров, которые они могут). Следование этому принципу максимизирует удобство и гибкость кода, который вызывает ваш метод, например, ваши модульные тесты. & Quot;

Другие советы

Всегда возвращайте наиболее точный тип, который вы можете вернуть. Таким образом, вы должны вернуть ViewResult, когда действие всегда показывает представление. Я бы использовал ActionResult только тогда, когда вы возвращаетесь в ViewResult в некоторых случаях (неверные опубликованные данные) или RedirectToRouteResult в других случаях.

С некоторыми продвинутыми сценариями actionfilter / executing вы можете даже вернуть совершенно разные вещи, которые не имеют ничего общего с ActionResult.

ActionResult является базовым классом для различных возвращаемых типов. Таким образом, ваше действие должно возвращать ActionResult или производный от него класс , чтобы работать. Наиболее распространенными являются ViewResult , JsonResult и т. Д.

Да, у меня есть книга Сандерсона, и мне понравилась эта часть о конкретности, так как это меня раздражало, когда я смотрел на другие примеры действий контроллера. Моя философия, даже b4, изучающая MVC, заключалась в том, что поскольку функции (методы, возвращающие значение) должны обрабатываться так, как если бы вы объявляли переменную / могли быть заменяемыми в контексте для переменной / ссылки того же типа, будьте конкретны в отношении типа, так как вы будет, если объявить переменную var (подумайте об этом, как о желании избежать определения всех ваших переменных как типа «Объект» в приложении - более надежным, но вы потеряете некоторую проверку во время разработки и безопасность типов). Облегчает тестирование модуля контроллера для правильного типа возврата.

Для получения соответствующей ссылки ознакомьтесь также с принципом замещения Листкова («L» в «SOLID»).

scroll top