Несколько подпапок содержимого в MvcContrib PortableArea
Я пытаюсь создать общий базовый проект ASP.MVC (C# и razor), содержащий общие контроллеры, _Layout.cshtml, css и js, для расширения многих наших веб-приложений.
Я подумал, что лучше всего использовать MvcContrib и создавать Portable Areas
Таким образом, настройка папки примерно так
BaseProj
- содержание
- JS
- плагины
- разное
- изображений
- Foo
- CSS
- JS
- Контроллеры
- Просмотры
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);
}
}
Это сработало для меня, но любые другие рекомендации о том, как настроить общий базовый проект для расширения множества веб-приложений, приветствуются