MVC .NET Предложите пользователю войти в систему - PullRequest
1 голос
/ 05 марта 2012

Я в растерянности. Прямо сейчас мой сайт будет перенаправлен на страницу входа, если время сеанса пользователя истекло. Одна проблема, которую я хочу решить, - когда пользователь нажимает кнопку действия во время входа в систему, он создает запрос ajax. Я хочу уловить тайм-аут перед запуском вызова ajax, открыть модальное диалоговое окно, предлагающее пользователю ввести имя пользователя и пароль, а затем выполнить вызов ajax после успешного входа в систему. Моя главная цель - сделать так, чтобы вызов ajax запускался после успешного входа в систему. Мне не обязательно создавать всплывающее окно, но я решил, что это будет лучшим способом.
Что я сделал до сих пор, так это. Я создал контроллер, цель которого в жизни - сообщить мне, есть ли тайм-аут. В функции ajaxStart () я загружаю div с результатами вызова этого контроллера. Если HTML в этом div содержит слова «Вход в систему», я вызываю window.showModalDialog. Иногда это работает, а иногда нет. Для меня это похоже на взлом, и должен быть лучший способ сделать это. Есть идеи ??

function ajaxStart() {
        var timeoutTest = $('#timeoutTest');
        timeoutTest.load(timeoutUrl);
        if (timeoutTest.html().indexOf('Log On') != -1) {
            window.showModalDialog(logonUrl, "", "dialogHeight: 600; dialogWidth: 400");
        }

        tid = setTimeout(showSpinner, 500);
    }

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Я бы порекомендовал вам взглянуть на следующую статью , в которой Фил Хаак иллюстрирует метод, который позволит вам настроить приложение для отправки кода состояния 401, если срок действия билета для аутентификации истек и запроссделано с использованием AJAX.Тогда вы могли бы очень легко поймать этот код состояния 401 на клиенте и показать модальное диалоговое окно.Вы даже можете сделать это глобально для всех запросов AJAX, возникающих на странице, подписавшись на обработчик событий .ajaxError() и обрабатывать эти ошибки в одном месте.

2 голосов
/ 05 марта 2012

Проблема с использованием ошибки ajax заключается в том, что перенаправление на страницу входа не является ошибкой ajax, и вам может понадобиться использовать это для других целей.Ваша страница входа в систему, вероятно, не всегда должна возвращать 401 ИМХО, так как она на самом деле является общедоступной страницей.

Я уверен, что моя страница входа возвращает специальный атрибут заголовка, который я могу искать.Мы используем много ajax, и у вас может быть глобальный скрипт, который его ищет (который не даст странице отображаться и позволит вам делать то, что вам нравится.

Ваш метод контроллера страницы входа будет выглядеть следующим образом:

public ActionResult LogOn()
{

    Response.AddHeader("REQUIRES_AUTH", "1");
    return View();
}

Тогда в глобальном масштабе вы можете иметь этот jquery, чтобы справиться с ним ...

$(document).bind("ajaxComplete", function (event, request, settings) {
    if (request.getResponseHeader("REQUIRES_AUTH") == "1") {
        ... addd popup code here.
    };
});

PS причина, по которой вы не всегда работаете, заключается в том, что ваш тест тайм-аута должен был бы отловитьистечение срока до того, как пользователь отправит сообщение. Это действительно немного лотерея, и лучше всего завершить ajax (помните, что страница входа по-прежнему является действительным ответом на сообщение ajax, но не тот, который мы хотим)

1 голос
/ 05 марта 2012

Почему бы вам не добавить класс HTML в #timeoutTest?Тогда вы можете сделать

timeoutTest.hasClass('logon');
...