如何在asp.net mvc中只显示一次页面

Mo *_*d A 9 asp.net-mvc

在我的应用程序中,我正在检查某个配置文件是否可用,如果不是,那么我想重定向到安装页面.

对我来说,实现这一目标的最佳地点是application_start.因为它只发生了一次.如果我办理入住手续application_start并写信,Response.Redirect我会得到Response is not available in this context.

我尝试过其他的答案在堆栈溢出的重定向application_startHttpContext.Current.Response.Redirect; 没有人为我工作.

我不想在a base controller或a中执行它,filter因为检查逻辑将针对每个请求发生.

我的目标是只检查一次,最好是应用程序启动时.

更新1

我将response.redirect添加到application_start但是得到了如下错误:

申请开始:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Response.RedirectToRoute(
            new RouteValueDictionary {
            { "Controller", "Home" },
            { "Action", "about" }
        });
    }
Run Code Online (Sandbox Code Playgroud)

但我收到这样的错误:

在这种情况下无法获得响应.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.Web.HttpException:响应在此上下文中不可用.

agr*_*fin 3

如果您确实想避免在设置后为每个请求运行过滤器,那么您可以执行以下操作:

RedirectAttribute.cs(通用示例)

public class RedirectAttribute : ActionFilterAttribute
{
    private readonly string _controller;
    private readonly string _action;

    public RedirectAttribute(string controller, string action)
    {
        _controller = controller;
        _action = action;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionDescriptor.ActionName != _action ||
            filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != _controller)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(new {controller = _controller, action = _action})
                );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Global.asax.cs 上面的“FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);”

if (/*Insert logic to check if the config file does NOT exist*/)
{
    //Replace "Setup" and "Index" with your setup controller and action below
    GlobalFilters.Filters.Add(new RedirectAttribute("Setup", "Index"));
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的用户完全完成设置后,您可以卸载应用程序域:

HttpRuntime.UnloadAppDomain();
Run Code Online (Sandbox Code Playgroud)

请注意:您需要确保您的应用程序有权卸载 AppDomain。如果没有,您可以在配置文件 (AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) 上尝试 File.SetLastWriteTimeUtc(...)。这也将卸载 AppDomain。

卸载 AppDomain 将“重新启动”Web 应用程序并再次调用 Application_Start()。该过滤器不会添加到您的请求中,因为您的 if 语句将确定该应用程序已配置。