Создать экран одноразовой настройки при первой загрузке приложения на основе критериев?

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

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

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

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

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

Ответ №1:

Я бы не стал использовать пользовательский маршрут 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 amp;amp; 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-версии индексного действия) вы устанавливаете Session["IsFirstRun"] = false , и все готово.

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

Ответ №2:

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

 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());
  

Ответ №3:

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

ИТАК, в вашем случае, это слишком рано, потому что, я полагаю, пока нет RequestContext.