Обязательно ASP.NET методы контроллера MVC возвращают ActionResult?
быть новичком ASP.NET MVC, мне было интересно о сигнатуре методов контроллера. Во всех примерах, которые я видел, они всегда возвращают ActionResult, даже если они на самом деле возвращают экземпляр ViewResult или аналогичный.
вот часто встречающийся пример:
public ActionResult Index()
{
return this.View();
}
в таком случае, не было бы больше смысла объявить метод как public ViewResult Index(), и получить более сильную поддержку типа?
эксперименты показывают, что это работает, так что кажется вероятный.
Я понимаю, что могут быть ситуации, когда полиморфизм желателен (например, если вы хотите перенаправить только в определенных ситуациях, но показать представление в других ситуациях), но если метод всегда возвращает представление, я бы нашел ViewResult более желательным.
Что касается будущей совместимости, ActionResult, очевидно, обеспечивает более надежную подпись, но если вы контролируете всю базу кода, всегда можно изменить подпись метода к более общему типу возврата, если это станет необходимым в будущем.
есть ли какие-либо другие соображения, о которых я не знаю, или я должен просто пойти вперед и объявить свои методы контроллера с определенными типами возврата?
6 ответов:
вы можете абсолютно использовать определенные типы возврата, хотя большинство примеров в интернете, кажется, возвратить ActionResult. Единственный раз, когда я вернусь ActionResult класс-это когда разные пути метода действия возвращают разные подтипы.
Стивен Сандерсон также рекомендует вернуть конкретные типы в своей книге Pro ASP.NET MVC Framework. Взгляните на цитату ниже:
"этот метод действий в частности объявляет, что он возвращает экземпляр ViewResult. Он будет работать точно так же, если вместо метода возвращаемый тип был ActionResult (базовый класс для всех результатов действий). На самом деле, некоторые ASP.NET программисты MVC объявляют все свои методы действий как возвращающие неспецифический ActionResult, даже если они точно знают, что он всегда будет возвращать один конкретный подкласс. Однако в объектно-ориентированном программировании хорошо зарекомендовал себя принцип, что методы должны возвращать наиболее конкретные типа они могут (а также принимать наиболее общие типы параметров могут). Следование этому принципу обеспечивает максимальное удобство и гибкость для кода, который вызывает ваш метод, например модульные тесты."
всегда возвращайте наиболее точный тип, который вы можете вернуть. Таким образом, Вы должны вернуть ViewResult, когда действие всегда показывает представление. Я бы использовал ActionResult только при возврате в ViewResult в некоторых случаях (недопустимые опубликованные данные) или RedirectToRouteResult в других случаях.
с некоторыми расширенными actionfilter / выполнения сценария, вы даже можете вернуть совершенно разные вещи, которые не имеют ничего общего с ActionResult.
[частичный ответ]: Вы не всегда возвращаете ActionResult, нет. Вот краткий обзор некоторых других результатов, которые вы можете вернуть:http://msdn.microsoft.com/en-us/library/dd410269%28v=vs.98%29.aspx
может быть, это немного поможет. Удачи вам!
Да, вы можете определить свои действия, как:
public ViewResult Index(). Но иногда ваше действие может возвращать разные результаты (это невозможно без объявления результата как базыActionResultкласс). Например:public ActionResult Show() { ... if(Request.IsAjaxRequest()) { return PartialView(...); } return View(...); }или:
public ActionResult Show() { ... try { ... } catch(Exception) { return RedirectToAction(...); } return View(...); }
ActionResult является базовым классом для различных видов. Поэтому ваше действие должно вернуть ActionResult или класс, производный от него для того, чтобы работать. Общие из них
ViewResult,JsonResultи т. д.
Да, у меня есть книга Сандерсона, и мне понравилась эта часть о том, чтобы быть конкретным, так как это было что-то досадное, когда я смотрел на другие примеры действий контроллера. Моя философия даже B4 learning MVC заключалась в том, что поскольку функции (методы, возвращающие значение) должны рассматриваться так, как если бы вы объявляли переменную/заменяемую в контексте переменной/ref одного и того же типа, Будьте конкретны о типе, как если бы вы объявили var (подумайте об этом, как о желании избежать определения всех ваших функций). переменные типа "объект" в приложении - более надежные, но вы теряете некоторую проверку времени разработки и безопасность типа). Облегчает модульный тест контроллера для правильного типа возврата.
для соответствующей ссылки ознакомьтесь также с принципом подстановки Листкова ("L" в "SOLID").
Comments