MVC Области и маршрутизация - PullRequest
0 голосов
/ 03 августа 2010

Я хотел бы иметь область под названием "Продукты", где я могу использовать такие маршруты, как

http://localhost/products/foo

http://localhost/products/bar

Я хотел бы, чтобы представления и другие ресурсы были организованы в структуру папок, например

/areas/products/views/foo/index.aspx
/areas/products/views/bar/index.aspx

Я хотел бы сохранить изображения и т. Д., Конкретно связанные с каждым продуктом (foo, bar) в соответствующих/ area / products / views / (foo | bar) / folder.

Я также не хочу добавлять действие контроллера для каждого продукта.

Если я объявлю маршрут как

context.MapRoute(
    "products-show-product"
    , "Products/{id}"
    , new { controller = "Products", action = "Index", id=UrlParameter.Optional }
    );

и запросю URL

http://localhost/products/foo

, тогда ProductsController.Index()называется, как я и ожидал.Однако, поскольку представление «foo» отсутствует в папке views / products или views / shared, оно не найдено.

Как это сделать, чтобы я мог хранить страницы каждого продукта в отдельномпапка

1 Ответ

1 голос
/ 03 августа 2010

У меня нет конкретного ответа на ваш вопрос, так как я не уверен в своем понимании этого вопроса. Однако у меня есть общее ощущение направления для решения.

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

Простая демонстрация. Я создал область под названием Blog, контроллер Blog с методом Index. В моем случае я использую действие контроллера как SubFolder, но я уверен, что это может быть распространено на ваш случай для каждой папки продукта. Я предполагаю, что продукт будет аргументом запроса. Площадь http://www.freeimagehosting.net/uploads/85b5306402.gif

Основная идея состоит в том, чтобы запросить контроллерный контекст для контроллера, области, действия и идентификатора и изменить то, что ищет стандартное представление. Расположение по умолчанию для видов области выглядит как "~/Areas/{2}/Views/{1}/{0}.aspx", поэтому мы можем в основном вводить значения для имени вида и в этом случае ActionName/Index. Местом просмотра будет ~/Area/Blog/Views/Blog/Index/Index.aspx.

Это всего лишь грубый набросок кода, который можно использовать. Сравнение строк определенно можно обновить до более надежных методов. В нынешнем виде этот метод будет работать для всего приложения, как и ожидалось, за исключением случая, когда в область «Блог» поступает запрос на действие «Индекс».

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        if (controllerContext.RouteData.DataTokens ["Area"] == "Blog" )
        {
            if (String.Compare(controllerContext.RouteData.Values ["Action"].ToString(),"Index",true) == 0)
            {
                var viewLocation = String.Format("{0}/{1}", controllerContext.RouteData.Values["Action"].ToString(), viewName);
                return base.FindView(controllerContext, viewLocation , masterName, useCache);
            }
        }
            return base.FindView(controllerContext, viewName, masterName, useCache);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...