Мы создаем сайт, который будет иметь очень минимальный код, это главным образом просто будет набором статических поданных страниц. Я знаю со временем, что это изменится, и мы захотим загрузить более динамическую информацию, таким образом, я решил идти вперед и создать веб-приложение с помощью ASP.NET MVC2 и механизма представления Spark. Будет несколько контроллеров, которые должны будут сделать фактическую работу (как в / области продуктов), но большая часть из нее будет статична.
Я хочу, чтобы мой разработчик смог создать и изменить сайт, не имея необходимость просить, чтобы я записал новый контроллер, или направить каждый раз они решают добавить или переместить страницу. Таким образом, если он хочет добавить страницу "http://example.com/News", он может просто создать папку "News" при Представлениях и поместить index.spark страницу в ней. Затем позже, если он решает, что хочет/News/Community страницу, он может отбросить community.spark файл в той папке и иметь ее работа.
Я могу иметь представление без определенного действия, заставляя мои контроллеры переопределить HandleUnknownAction, но я все еще должен создать контроллер для каждой из этих папок. Кажется глупым должным быть добавить пустой контроллер, и перекомпилировать каждый раз они решают добавить область к сайту.
Там какой-либо путь состоит в том, чтобы сделать это легче, таким образом, я только должен записать контроллер и перекомпилировать, если существует фактическая логика, которая будет сделана? Своего рода "основной" контроллер, который обработает какие-либо запросы, где не было никакого определенного определенного контроллера?
Вам нужно будет написать сопоставление маршрутов для фактического контроллера / действий и убедиться, что по умолчанию в качестве действия указан индекс, а идентификатор - "catchall", и это будет сделано!
public class MvcApplication : System.Web.HttpApplication {
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "catchall" } // Parameter defaults
);
}
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new CatchallControllerFactory());
}
}
public class CatchallController : Controller
{
public string PageName { get; set; }
//
// GET: /Catchall/
public ActionResult Index()
{
return View(PageName);
}
}
public class CatchallControllerFactory : IControllerFactory {
#region IControllerFactory Members
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) {
if (requestContext.RouteData.Values["controller"].ToString() == "catchall") {
DefaultControllerFactory factory = new DefaultControllerFactory();
return factory.CreateController(requestContext, controllerName);
}
else {
CatchallController controller = new CatchallController();
controller.PageName = requestContext.RouteData.Values["action"].ToString();
return controller;
}
}
public void ReleaseController(IController controller) {
if (controller is IDisposable)
((IDisposable)controller).Dispose();
}
#endregion
}
Не могли бы вы создать отдельный контроллер для всех статических страниц и перенаправить на него все (кроме реальных контроллеров, которые действительно работают) с помощью маршрутов MVC и включить параметры пути? Затем в этом контроллере у вас может быть логика для отображения правильного представления на основе параметра папки / пути, отправленного ему маршрутами.
Хотя я не знаю, что движок Spark View что-то обрабатывает, должен ли он компилировать представления? Я действительно не уверен.
Я думаю, вы можете создать свою собственную фабрику контроллеров, которая всегда будет создавать экземпляры одного и того же класса контроллера.