Как настроить Asp.net Mvc для перенаправления каждого запроса на страницу конфигурации? - PullRequest
1 голос
/ 16 июня 2009

Для проекта Asp.net Mvc мне нужно перенаправлять каждый запрос на страницу конфигурации, когда пользователь (должен быть администратором этого сайта) посещает этот сайт в первый раз. Эта операция похожа на страницу входа по умолчанию (каждый запрос будет перенаправлен на страницу входа по умолчанию, если доступ запрещен).

После того, как пользователь настроит файл конфигурации, таблица маршрутов будет сопоставлена ​​с обычными контроллерами.

Ps. Эта страница должна помочь администратору в обнаружении ошибок конфигурации и простоте развертывания.

Обновление № 1 Я пытаюсь использовать ASP.NET MVC WebFormRouting Demo на Codeplex. Но я не могу перенаправить, когда пользователь посещает какую-либо существующую страницу, такую ​​как «~ / AccessDenied.aspx» или «~ / web.config».

routes.MapWebFormRoute("RedirectToConfig", "{*anything}", "~/App_Config");

Спасибо

Ответы [ 3 ]

2 голосов
/ 17 июня 2009

По вашему описанию это похоже на проблему авторизации, поэтому я бы рекомендовал пользовательский класс атрибутов Authorize (наследовать от AuthorizeAttribute).

Отсюда вы можете переопределить метод OnAuthorization, где вы можете проверить, выполнил ли пользователь необходимые шаги по настройке, и соответственно установить filterContext.Result. Базовая реализация будет выглядеть примерно так (предполагается, что у вас есть действительный маршрут / учетная запись / настройка маршрута):

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        var user = ; // get your user object

        if(user.IsConfigured == false)  // example
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                    {
                        {
                            "ConfigureUserRoute",
                            filterContext.RouteData.Values["ConfigureUserRoute"]
                        },
                        {"controller", "Account"},
                        {"action", "Configure"}
                    });
           return;
        }
    }
}

Другие примеры создания собственного класса AuthorizeAttribute можно найти здесь, в StackOverflow.

1 голос
/ 16 июня 2009

2 идеи:

  • Используйте универсальное правило поверх таблицы маршрутизации и наложите на него ограничение, которое проверяет состояние конфигурации
  • Поместите код для этой проверки в Application_BeginRequest в GlobalAsax

Детали для всеобъемлющей идеи:

  • Создайте правило с URL "{* path}" и поместите его первым в ваш список
  • Создать ограничение для активации этого правила только в том случае, если конфигурация еще не выполнена
  • Создать простой контроллер, например ConfigController с одним действием, которое ничего не делает, кроме RedirectToUrl("config.aspx")

Но решение в Application_BeginRequest было бы проще, поскольку весь код для обработки этого в одном месте

0 голосов
/ 18 июня 2009

Теперь я могу применить технику из моего другого вопроса , чтобы решить эту проблему. Держите некоторое значение в статическом экземпляре при запуске приложения. Пожалуйста, посмотрите на следующий код.

частичный ConfigBootstapper.cs

public class ConfigBootstapper
{
    public static EnableRedirectToConfigManager = false;
}

частичный ConfigModule.cs

void HttpApplication_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = sender as HttpApplication;

    if (ConfigBootstapper.EnableRedirectToConfigManager)
    {
        app.Response.Redirect("~/App_Config");
    }
}

частичный Global.asax

protected void Application_Start()
{
    [logic for setting ConfigBootstapper.EnableRedirectToConfigManager value]
}

PS. Не забудьте проверить некоторые условия, которые вызывают бесконечный цикл перед перенаправлением.

...