Подтвердить что ты не робот

Частичный класс для контроллера

Можно ли создать класс Partial для контроллера в MVC?

Причина: У меня есть контроллер, который содержит слишком много кода. Этот контроллер содержит код для разных отчетов, и из-за слишком большого количества кода он снижает читаемость кода. Я хочу, чтобы имя контроллера было одинаковым для всех отчетов, поэтому я хочу распространять код для разных отчетов.

Если я могу сделать любой другой способ, чем сообщить мне.

Спасибо Алок Шах

4b9b3361

Ответ 1

Да, вы можете использовать неполный класс - компилятор просто объединяет их все время компиляции для его создания.

Однако вы упомянули, что хотите "распространять" код - если код должен идти в несколько проектов, тогда частичные действия не помогут.

Вместо этого вы можете создавать классы базового контроллера (которые наследуют от System.Web.Mvc.Controller в проекте библиотеки классов, с необходимыми методами действий, а затем просто используют маршрутизацию для маршрутизации похожих URL-адресов для разных контроллеров. Здесь ссылка на учебник Asp.Net "Создание пользовательских маршрутов" , который может быть полезен для этого. Я настоятельно рекомендую просмотреть оставшуюся часть учебника, если есть другие основные аспекты MVC вы не уверены. Он не охватывает все, но он делает основы.

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

Итак, "Reports/Customers" может перейти на CustomerReportsController и "Reports/Orders" может перейти на OrdersReportsController:

routes.MapRoute("CustReports",
  "Reports/Customers/{action}",
  new { controller = "CustomerReports", action = "Index", id = "" } );

routes.MapRoute("OrderReports",
  "Reports/Orders/{action}",
  new { controller = "OrdersReports", action = "Index", id = "" } );

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

Ответ 2

Конечно!

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

Ответ 3

Да. Частичные классы - это просто функция языка, а скомпилированный класс является обычным .NET-классом, как и любой другой.

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

Ответ 4

"Если я могу сделать любой другой способ, чем сообщить мне"

Как насчет:

  • Откажитесь от "выполнения" частей к различным генераторам отчетов для дискретных типов отчетов, все из которых соответствуют интерфейсу. Эти генераторы отчетов будут классами, расположенными вне уровня MVC приложения.
  • Очистите контроллер так, чтобы зависимости (генераторы отчетов) встраивались в конструктор, используя Ninject, StructureMap или Castle Windsor
  • Очистите весь код генерации отчета вне контроллера и в конкретные реализации абстракций генератора отчетов

Вам не нужно разделить контроллеры на отдельные классы. Недостатком является то, что это займет достаточное количество времени для концептуализации и реализации, но вы получите лучшую кодовую базу.