#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.