Asp.net mvc 3 根据标准首次加载应用程序时是否创建一次性设置屏幕?

Asp.net mvc 3 根据标准首次加载应用程序时是否创建一次性设置屏幕?,asp.net-mvc-3,Asp.net Mvc 3,在我的申请表中,我想这样做 if(settings = null) { // redirect the request to example.com/setup } 我已经尝试使用webactivator来实现这一点,但现在重定向请求似乎还为时过早。 另一种方法是使用基本控制器并检查每个请求,但这似乎不是一个好主意 那么,有人能推荐一个解决方案吗?我需要为我的开源项目做同样的事情。我最终使用了一个定制的控制器工厂。如果未配置站点,我将使用以下代码重定向到设置控制器: public class

在我的申请表中,我想这样做

if(settings = null) {
// redirect the request to example.com/setup
}
我已经尝试使用webactivator来实现这一点,但现在重定向请求似乎还为时过早。 另一种方法是使用基本控制器并检查每个请求,但这似乎不是一个好主意


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

我需要为我的开源项目做同样的事情。我最终使用了一个定制的控制器工厂。如果未配置站点,我将使用以下代码重定向到设置控制器:

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

你说得对,现在太早了。不要忘记WebActivator.PreStartUpMethod属性在应用程序启动之前运行指定的方法


因此,在您的情况下,现在还为时过早,因为我认为还没有RequestContext。

我不会选择custom ControllerFactory路线。使用自定义控制器工厂时,我的结果好坏参半。此外,如果您将使用ServiceStack或其他框架,您将被迫使用其控制器工厂

IMHO首选方法是使用基本控制器并在那里处理执行的操作。我使用它将继承基础的所有控制器的配置注入到
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");
        }
    }
设置
控制器的
索引
操作中(即在索引操作的后期版本中),您将设置
会话[“IsFirstRun”]=false
,这样就可以开始了

由于
SetupConfigProvider.IsFirstRun()
通常是一个昂贵的IO操作,因此在会话中缓存值会阻止应用程序始终查看数据存储(或磁盘)。只有当
Session[“IsFirstRun”]
均为null且
IsFirstRun()
returs
true
时,才会发生这种情况