Создать экран однократной настройки при первой загрузке приложения на основе критериев? - PullRequest
1 голос
/ 15 мая 2011

В моем приложении я хотел бы что-то вроде этого

if(settings = null) {
// redirect the request to example.com/setup
}

Я пытался использовать webactivator для этого, но, похоже, рано перенаправлять запрос. Другой способ - иметь базовый контроллер и проверять каждый запрос, но это кажется плохой идеей.

Итак, кто-нибудь может порекомендовать решение?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2013

Я бы не пошел с пользовательским маршрутом ControllerFactory. У меня были смешанные результаты при использовании пользовательских заводов контроллеров. Также, если вы будете использовать ServiceStack или какой-либо другой фреймворк, вы будете вынуждены использовать фабрику их контроллеров.

ИМХО предпочтительным способом является использование базового контроллера и обработка там OnActionExecuted. Я использую его для ввода конфигурации в ViewBag для всех контроллеров, которые наследуют базу, так что конфигурация доступна через ViewBag в моих представлениях.

Вы также можете поставить здесь проверки при первом запуске, например:

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        // store administration configuration for Views
        ViewBag.AdminConfig = AdminConfig;

        // check for setup config; we are on the first run, if it doesn't exist
        if (Session["IsFirstRun"] == null && SetupConfigProvider.IsFirstRun())
        {
            // clear the current response to prevent unwanted behaviour
            Response.Clear();
            // redirect to the Setup controller
            filterContext.Result = RedirectToAction("Index", "Setup");
        }
    }

В действии Index контроллера Setup (то есть внутри версии POST действия Index, то есть), вы устанавливаете Session["IsFirstRun"] = false и все готово.

Поскольку SetupConfigProvider.IsFirstRun() часто является дорогостоящей операцией ввода-вывода, кэширование значения в сеансе не позволяет приложению всегда просматривать хранилище данных (или диск). Это произойдет только в первый раз, когда оба значения Session["IsFirstRun"] равны нулю, а IsFirstRun() возвращаются true.

0 голосов
/ 27 января 2012

Вы правы, это слишком рано.НЕ забывайте, что атрибут WebActivator.PreStartUpMethod запускает указанный метод ДО App_Start.

В вашем случае это слишком рано, потому что RequestContext еще нет, я верю.

0 голосов
/ 09 июля 2011

Мне нужно было сделать то же самое для моего проекта с открытым исходным кодом WeBlog . В итоге я использовал фабрику пользовательских контроллеров. Если сайт не настроен, я перенаправляю на контроллер установки, используя следующий код:

public class WeBlogControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        if (!SiteManager.Any())
        {
            requestContext.RouteData.Values["action"] = "Index";
            requestContext.RouteData.Values["controller"] = "Setup";
            return base.CreateController(requestContext, "Setup");
        }

        return base.CreateController(requestContext, controllerName);
    }
}

Чтобы зарегистрировать свою фабрику пользовательских контроллеров, просто добавьте эту строку в метод application_start в global.asax:

ControllerBuilder.Current.SetControllerFactory(new WeBlogControllerFactory());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...