ASP.NET MVC - Как отобразить представление «ActionResult», которое возвращается в JavaScript? - PullRequest
0 голосов
/ 01 ноября 2010

Я использую DotNetOpenAuth с провайдером нестандартного входа для входа пользователей на мой сайт.У меня большая часть кода работает, но у меня проблема с возвратом представления и его отображением, чтобы пользователи могли войти в провайдера.По сути, действие возвращает actionresult, который является страницей входа конкретного провайдера, обратно в вызывающий javascript.Я ожидал этого, так как мне нужно получить результаты входа обратно в JavaScript.В основном, что происходит, я получаю некоторую ошибку о разрешении доступа, затем три пустых поля (смотрите в ответе на вызов) и затем ничего.Мне нужно, чтобы перейти на сайт провайдера и войти в систему.

Пример данных: url = https://www.google.com/accounts/o8/id, requireUserName = false, username = test (предположим, он был введен в текстовое поле).

Ниже приведен код:

JavaScript:

function ProviderSignOn(url, requiresUserName) {
    var username = $("#openUserNameText").val();
    if ((requiresUserName == 'True') && (username == '')) {
        clickedProviderUrl = url;
        $('#openUserNameDiv').show('fast');
    }
    else {
        $('#openUserNameDiv').hide('fast');
        $("#openUserNameText").val('');
        $.ajax({
            type: "POST",
            url: "/Account/ProviderSignOn",
            data: "provider=" + url + "&username=" + username,
            success: function (data) {
                alert(data.Error);
                alert(data.Message);
                alert(data.Identifier);
            },
            failure: function (data) {
                alert(data.Error);
                alert(data.Message);
                alert(data.Identifier);
            }
        });
    }
}

Действие контроллера:

public ActionResult ProviderSignOn(string provider, string username)
    {
        string providerUrl = provider.Replace("{username}", username);
        bool error = true;
        string message = String.Empty;
        string identifier = String.Empty;

        var response = _openId.GetResponse();

        if (response == null)
        {
            Identifier id;

            if (Identifier.TryParse(providerUrl, out id))
            {
                try
                {
                    return _openId.CreateRequest(providerUrl).RedirectingResponse.AsActionResult();
                }
                catch (ProtocolException ex)
                {
                    throw ex;
                }
            }
            else
            {
                error = true;
                message = "Invalid";
                identifier = String.Empty;
            }
        }
        else
        {
            switch (response.Status)
            {
                case AuthenticationStatus.Authenticated:
                    error = false;
                    message = "Success";
                    identifier = response.ClaimedIdentifier;
                    break;
                case AuthenticationStatus.Canceled:
                    error = true;
                    message = "Canceled";
                    identifier = String.Empty;
                    break;
                case AuthenticationStatus.Failed:
                    error = true;
                    message = "Failed";
                    identifier = String.Empty;
                    break;
            }
        }

        return Json(new { Error = error, Message = message, Identifier = identifier });
    }

1 Ответ

1 голос
/ 01 ноября 2010

Если я понимаю ваш вопрос, вы достигаете этой строки кода:

return _openId.CreateRequest(providerUrl).RedirectingResponse.AsActionResult();

, но затем JavaScript не знает, как обращаться с результатом перенаправления, возвращаемым из вызова Ajax.

В этом случае я бы сказал, что вы возвращаете не ту вещь.Вместо этого вам, вероятно, следует сделать что-то вроде этого:

return Json(new { RedirectUri = _openId.CreateRequest(providerUrl).RedirectingResponse.Uri });

, но я не знаю, что это за объект RedirectingResponse (например, имеет ли он какое-либо свойство Uri?).Просто providerUrl не сработает, верно?

В любом случае, тогда в вашем JavaScript вы можете сделать

success: function (data)
{
    if (data.RedirectUri)
    {
        window.location.href = data.RedirectUri;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...