第一次根据条件加载应用程序时创建一次性设置屏幕?

时间:2011-05-15 08:12:13

标签: asp.net-mvc-3

在我的申请中,我想要这样的事情

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

我曾尝试过使用webactivator,但似乎要尽早重定向请求。 另一种方法是有一个基本控制器并检查每个请求,但这似乎是一个坏主意。

那么,有人可以推荐一个解决方案吗?

3 个答案:

答案 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。