在我的申请中,我想要这样的事情
if(settings = null) {
// redirect the request to example.com/setup
}
我曾尝试过使用webactivator,但似乎要尽早重定向请求。 另一种方法是有一个基本控制器并检查每个请求,但这似乎是一个坏主意。
那么,有人可以推荐一个解决方案吗?
答案 0 :(得分:2)
我不会使用自定义ControllerFactory路由。使用自定义控制器工厂时,我的结果好坏参半。此外,如果您将使用ServiceStack或其他框架,您将被迫使用他们的控制器工厂。
恕我直言,首选方法是使用Base控制器并在那里处理OnActionExecuted
。我使用它为所有继承Base的控制器注入Configuration 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
操作中(在Index操作的POST版本中,即),您将设置Session["IsFirstRun"] = false
并且您很高兴
由于SetupConfigProvider.IsFirstRun()
通常是一项昂贵的IO操作,因此在Session中缓存该值会阻止应用程序始终查看数据存储区(或磁盘)。这只会在Session["IsFirstRun"]
为空且IsFirstRun()
重新调整true
时首次发生。
答案 1 :(得分:0)
我需要为我的开源项目WeBlog做同样的事情。我最终使用了自定义控制器工厂。如果未配置站点,则使用以下代码重定向到Setup控制器:
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);
}
}
要注册自定义控制器工厂,只需将此行添加到global.asax中的application_start方法:
ControllerBuilder.Current.SetControllerFactory(new WeBlogControllerFactory());
答案 2 :(得分:0)
你是对的,现在还为时过早。不要忘记WebActivator.PreStartUpMethod属性在App_Start之前运行指定的方法。
所以在你的情况下,现在还为时过早,因为我相信还没有RequestContext。