Несколько подпапок содержимого в MvcContrib PortableArea

Я пытаюсь создать общий базовый проект ASP.MVC (C# и razor), содержащий общие контроллеры, _Layout.cshtml, css и js, для расширения многих наших веб-приложений.

Я подумал, что лучше всего использовать MvcContrib и создавать Portable Areas

Таким образом, настройка папки примерно так

BaseProj

  • содержание
    • JS
      • плагины
      • разное
    • изображений
      • Foo
    • CSS
  • Контроллеры
  • Просмотры

MainProj

  • содержание
  • Контроллеры
  • Просмотры

Я регистрирую область BaseProj, расширяя класс PortableAreaRegistration (согласно документации MvcContrib), поэтому этот URL работает...

htttp: // локальный / MainProj / BaseProj /

Глядя в коде MvcContrib для PortableAreaRegistration, он также регистрирует 3 статических маршрута (изображения, стили, сценарии) в разделе Content.

Поэтому этот URL тоже работает нормально...

htttp: //localhost/MainProj/BaseProj/images/bar.jpg

также подпапки работают нормально, только если я использую точку вместо косой черты... htttp: //localhost/MainProj/BaseProj/images/foo.bar.jpg

Однако для организации очень полезно иметь подпапки в изображениях, CSS, JS и т. Д. Эти подпапки теперь будут 404, хотя

то есть это не будет работать.... htttp://localhost/MainProj/BaseProj/images/foo/bar.jpg

Итак, вопрос в том, как мне отобразить подпапки под изображениями (без точечной нотации)? т.е. так это работает.... htttp://localhost/MainProj/BaseProj/images/foo/bar.jpg

Спасибо

РЕДАКТИРОВАТЬ:

Ну немного подумав и я нашел решение. Интересно, могут ли такие вещи быть включены в MvcContrib.Portable Areas по умолчанию.

Сначала создайте маршрут перехвата всех в вашем BaseProjRegistration.cs, чтобы перехватить все подпапки контента

public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
{
    ...

        //static controller with catch all for all subfolders of content
        context.MapRoute(
            "BaseProjContent",
            "BaseProj/Content/{*resourceName}",
           new { controller = "Content", action = "LoadContent", resourcePath =    "Content" }
       );
    ...
}

Затем создайте класс ContentController в вашем BaseProj, который будет расширять MvcContrib.PortableAreas.EmbeddedResourceController.

Это преобразует косые черты в точки для загрузки содержимого BaseProj из DLL, т.е. /BaseProj/Content/images/foo/bar.jpg => /BaseProj/Content/images.foo.bar.jpg

public class ContentController : MvcContrib.PortableAreas.EmbeddedResourceController
{

    public ActionResult LoadContent(string resourceName, string resourcePath)
    {
        string actualResourceName = resourceName.Replace("/", ".");
        return base.Index(actualResourceName, resourcePath);
    }
}

Это сработало для меня, но любые другие рекомендации о том, как настроить общий базовый проект для расширения множества веб-приложений, приветствуются

0 ответов

Другие вопросы по тегам