ASP MVC Папка Иерархия - PullRequest
       9

ASP MVC Папка Иерархия

3 голосов
/ 12 марта 2009

У меня довольно большое приложение ASP MVC. Вместо того, чтобы иметь много контроллеров в каталоге контроллеров, я бы предпочел создать некоторую иерархию. Так что я мог бы иметь что-то вроде

~\Controllers\Security\
~\Controllers\Maintenance\
~\Controllers\Reports\

Я бы тоже хотел сделать то же самое с Views

~\Views\Security\Users\
~\Views\Security\Roles\
~\Views\Maintenance\Customer\
~\Views\Maintenance\Product\

Это легко сделать?

Ответы [ 5 ]

4 голосов
/ 12 марта 2009

Я думаю, вы ищете что-то вроде того, что "мастер" говорит в этом посте:

http://haacked.com/archive/0001/01/01/areas-in-aspnetmvc.aspx

По сути, вам нужно создать ViewEngine, чтобы указать, где искать представления. Это довольно простой код, просто не забудьте зарегистрировать его в global.asax! Что касается части контроллера, вам придется регистрировать новые маршруты также в global.asax.

2 голосов
/ 12 марта 2009

Концепция, которую вы ищете, называется «области», как обрисовал в общих чертах Фил Хаак: http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx

1 голос
/ 27 июля 2015

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

Описано в этом посте http://timgthomas.com/2013/10/feature-folders-in-asp-net-mvc/

Примеры кода в репозитории Джимми Богарда https://github.com/jbogard/presentations/tree/master/putyourcontrollersonadietv2

1 голос
/ 12 марта 2009

Я думаю, вам нужно написать свой собственный RouteHandler, который не должен быть слишком сложным.

Появился быстрый поиск в Google: Это сообщение в блоге, детализирующее его

0 голосов
/ 22 сентября 2013

Здесь вы действительно хотите, чтобы иерархия папок Views соответствовала иерархии пространства имен ваших контроллеров. Вы можете написать собственный ViewEngine, чтобы сделать это довольно легко - подробнее см. Мой проект ControllerPathViewEngine на GitHub .

Я включил фрагмент класса ControllerPathRazorViewEngine, чтобы описать, как он работает. Перехватывая методы FindView / FindPartialView и заменяя имя контроллера на путь к папке (на основе пространства имен и имени контроллера), мы можем получить его для загрузки представлений из вложенных папок в основной папке Views.

    public class ControllerPathRazorViewEngine : RazorViewEngine
    {
        //... constructors etc.

        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            return FindUsingControllerPath(controllerContext, () => base.FindView(controllerContext, viewName, masterName, useCache));
        }

        public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
            return FindUsingControllerPath(controllerContext, () => base.FindPartialView(controllerContext, partialViewName, useCache));
        }

        private ViewEngineResult FindUsingControllerPath(ControllerContext controllerContext, Func<ViewEngineResult> func)
        {
            string controllerName = controllerContext.RouteData.GetRequiredString("controller");
            string controllerPath = controllerPathResolver.GetPath(controllerContext.Controller.GetType());
            controllerContext.RouteData.Values["controller"] = controllerPath;
            var result = func();
            controllerContext.RouteData.Values["controller"] = controllerName;
            return result;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...