Простой ASP.NET MVC просматривает, не пишущий контроллер

Мы создаем сайт, который будет иметь очень минимальный код, это главным образом просто будет набором статических поданных страниц. Я знаю со временем, что это изменится, и мы захотим загрузить более динамическую информацию, таким образом, я решил идти вперед и создать веб-приложение с помощью ASP.NET MVC2 и механизма представления Spark. Будет несколько контроллеров, которые должны будут сделать фактическую работу (как в / области продуктов), но большая часть из нее будет статична.

Я хочу, чтобы мой разработчик смог создать и изменить сайт, не имея необходимость просить, чтобы я записал новый контроллер, или направить каждый раз они решают добавить или переместить страницу. Таким образом, если он хочет добавить страницу "http://example.com/News", он может просто создать папку "News" при Представлениях и поместить index.spark страницу в ней. Затем позже, если он решает, что хочет/News/Community страницу, он может отбросить community.spark файл в той папке и иметь ее работа.

Я могу иметь представление без определенного действия, заставляя мои контроллеры переопределить HandleUnknownAction, но я все еще должен создать контроллер для каждой из этих папок. Кажется глупым должным быть добавить пустой контроллер, и перекомпилировать каждый раз они решают добавить область к сайту.

Там какой-либо путь состоит в том, чтобы сделать это легче, таким образом, я только должен записать контроллер и перекомпилировать, если существует фактическая логика, которая будет сделана? Своего рода "основной" контроллер, который обработает какие-либо запросы, где не было никакого определенного определенного контроллера?

10
задан Cœur 31 December 2016 в 06:58
поделиться

3 ответа

Вам нужно будет написать сопоставление маршрутов для фактического контроллера / действий и убедиться, что по умолчанию в качестве действия указан индекс, а идентификатор - "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
    }
6
ответ дан 4 December 2019 в 01:00
поделиться

Не могли бы вы создать отдельный контроллер для всех статических страниц и перенаправить на него все (кроме реальных контроллеров, которые действительно работают) с помощью маршрутов MVC и включить параметры пути? Затем в этом контроллере у вас может быть логика для отображения правильного представления на основе параметра папки / пути, отправленного ему маршрутами.

Хотя я не знаю, что движок Spark View что-то обрабатывает, должен ли он компилировать представления? Я действительно не уверен.

1
ответ дан 4 December 2019 в 01:00
поделиться

Я думаю, вы можете создать свою собственную фабрику контроллеров, которая всегда будет создавать экземпляры одного и того же класса контроллера.

0
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: