ASP.NET MVC: критерии для метода контроллера, чтобы быть действием? - PullRequest
0 голосов
/ 20 августа 2009

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

Я бы предположил, что критерием может быть тип возвращаемого значения (он должен быть ActionResult или производной). Это правда? А как насчет статических методов?

Ответы [ 3 ]

5 голосов
/ 20 августа 2009

Чтобы метод считался действием, он должен соответствовать следующим критериям:

  • Это должно быть public, а не static
  • У него не должно быть «специального» имени для исключения конструкторов, событий и т. Д.
  • Он не должен быть определен для System.Web.Mvc.Controller или любого другого базового класса, чтобы исключить .ToString() и семейство.

Универсальные методы вызовут исключение, но по какой-то причине они are считают действия. Что касается типа возврата, он не обязательно должен быть ActionResult, так как вы можете вернуть, например, string для текстовых данных.

1 голос
/ 20 августа 2009

Определение истинного списка действий на контроллере является сложной задачей. Единственный правильный ответ: «зависит»! Список, который дал Саулюс, в значительной степени правильный - если вы используете ControllerActionInvoker по умолчанию - который, конечно, использует большинство людей.

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

Вам нужно написать класс, производный от ControllerActionInvoker, чтобы можно было вызывать метод GetControllerDescriptor (). Возвращаемое значение этого метода - ControllerDescriptor, который является абстрактным дескриптором того, что имеет контроллер. Затем вы можете вызвать GetCanonicalActions (), которая возвращает список ActionDescriptors. Каждый из этих элементов представляет собой типичный метод действий.

Чтобы все это подключить, вам нужно:

  1. Создайте свой контроллер
  2. Установите его свойство ActionInvoker в качестве экземпляра вашего пользовательского инициатора
  3. Создайте экземпляр ControllerContext, для которого его экземпляр Controller установлен на ваш контроллер
  4. Вызвать новый открытый метод на вашем вызывающем, который в свою очередь вызывает GetControllerDescriptor ()

Затем проверьте результаты, и все готово!

Конечно, я не пробовал ничего из этого, но теоретически все это работает:)

1 голос
/ 20 августа 2009

Я считаю, что все открытые методы в контроллере рассматриваются как действия - даже один возвращает строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...